Dot-Net

.NET:如何讓後台執行緒信號主執行緒數據可用?

  • July 12, 2013

讓ThreadA向某個事件的****ThreadB發出信號,而不讓ThreadB被阻塞等待事件發生的正確技術是什麼?

我有一個後台執行緒將填充一個共享列表<T>。我正在嘗試找到一種方法來非同步向“主”執行緒發出信號,表明有數據可供提取。


我考慮使用 EventWaitHandle 對象設置一個事件,但我不能讓我的主執行緒坐在 Event.WaitOne() 上。


我考慮有一個委託回調,但是a)我不希望主執行緒在委託中工作:執行緒需要重新開始工作添加更多的東西——我不希望它在委託執行時等待,並且b ) 委託需要編組到主執行緒上,但我沒有執行 UI,我沒有控制權來 .Invoke 委託反對。


我認為有一個委託回調,它只是啟動一個零間隔 System.Windows.Forms.Timer(執行緒訪問同步的定時器)。這樣執行緒只需要在呼叫時被卡住

Timer.Enabled = true;

但這似乎是一個黑客行為。

在過去,我的對象會創建一個隱藏視窗,並讓執行緒將消息發佈到該隱藏視窗的 HWND。我考慮過創建一個隱藏控制項,但我認為你不能在沒有創建句柄的控制項上呼叫。另外,我沒有 UI:我的對象可能是在 Web 伺服器、服務或控制台上創建的,我不希望出現圖形控制項 - 我也不希望編譯對 System.Windows 的依賴項。形式。


我考慮讓我的對象公開一個 ISynchronizeInvoke 介面,但是我需要實現 .Invoke(),這就是我的問題。


讓執行緒 A 向某個事件的執行緒 B 發出信號,而不讓執行緒 B 被阻塞等待事件發生的正確技術是什麼?

這是 System.ComponentModel.BackgroundWorker 類的程式碼範例。

   private static BackgroundWorker worker = new BackgroundWorker();
   static void Main(string[] args)
   {
       worker.DoWork += worker_DoWork;
       worker.RunWorkerCompleted += worker_RunWorkerCompleted;
       worker.ProgressChanged += worker_ProgressChanged;
       worker.WorkerReportsProgress = true;

       Console.WriteLine("Starting application.");
       worker.RunWorkerAsync();

       Console.ReadKey();
   }

   static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
   {
       Console.WriteLine("Progress.");
   }

   static void worker_DoWork(object sender, DoWorkEventArgs e)
   {
       Console.WriteLine("Starting doing some work now.");

       for (int i = 0; i &lt; 5; i++)
       {
           Thread.Sleep(1000);
           worker.ReportProgress(i);
       }
   }

   static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
   {
       Console.WriteLine("Done now.");
   }

引用自:https://stackoverflow.com/questions/122882