Dot-Net
.NET:如何讓後台執行緒信號主執行緒數據可用?
讓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 < 5; i++) { Thread.Sleep(1000); worker.ReportProgress(i); } } static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Console.WriteLine("Done now."); }