-2

重複の可能性:
WPF の DoEvent() と同等

私は数日前にこれらの質問をしますが、私はWPFでまったく新しいものであり、スレッドについて何も知らないため、あまり役立つコメントは得られませんでしたが、今日はタスクを提供する必要があり、これらをできるだけ早く実行する必要があります。前回はWindowsフォームを使用し、関数を使用していますDoEvent(); 私はプログラムをWPFに移動し、イベントをサポートしなくなったため、これらの関数を変換する必要があります

PS: これらの機能は、com ポートにデータを送信し、UI を更新することです。

 private void Send(byte[] cmd)
        {
            bWaiting = true;
            MyResp = new byte[0];

            WriteOnPort(cmd);

            while (bWaiting == true) // here is a problem
            {
                System.Windows.Forms.Application.DoEvents();  // here is a problem
                System.Threading.Thread.Sleep(15);
            }
        }

私は本当に今日までにこれらを終わらせる必要があり、それを解決する方法がわかりません。

4

2 に答える 2

2

簡単なオプションはWriteOnPort、UI の更新をハッキングするよりもスレッド化することです。

ここで必要なものに応じて、2つの例があります

  1. シンプルなスレッド方式。

    private void Send(byte[] cmd)
    {
        ThreadPool.QueueUserWorkItem((o) => WriteOnPort(cmd));
    }
    
  2. を使用するため、が完了したときにイベントBackroundWorkerを使用できますCompletedWriteOnPort

    private void Send(byte[] cmd)
    {
        var worker = new BackgroundWorker();
        worker.RunWorkerAsync(cmd);
        worker.DoWork += (s, e) =>
        {
           WriteOnPort(e.Argument as byte[]);
        };
        worker.RunWorkerCompleted += (cs, ce) =>
        {
           // do anything you need on completion
        };
    }
    

System.Windows.Forms.Application.DoEvents()恐ろしいハックであり、Winformsでこの方法で使用することは絶対に避けてください.WPFで同じハックを行う方法を見つけようとするのはばかげThreadingています.これはいつかあなたを悩ませるために戻ってきます。

于 2013-01-29T02:16:03.187 に答える
-2
public static void DoEvents()
{
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,                                        new Action(delegate { }));
}
于 2013-01-29T02:24:31.750 に答える