【发布时间】:2011-05-10 13:42:13
【问题描述】:
灵感来自我自己使用多线程 Winforms 应用程序的经验,以及诸如
之类的问题- Avoiding the woes of Invoke/BeginInvoke in cross-thread WinForm event handling?
- Avoid calling Invoke when the control is disposed
我想出了一个非常简单的模式,我想验证它的正确性。
基本上,我正在创建(并在应用程序的整个生命周期中运行)一个 BGW,其唯一目的是同步调用请求。考虑:
public MainForm()
{
InitializeComponent();
InitInvocationSyncWorker();
}
private void InitInvocationSyncWorker()
{
InvocationSync_Worker.RunWorkerAsync();
}
private void InvocationSync_Worker_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(Timeout.Infinite);
}
void InvokeViaSyncWorker(Action guiAction)
{
InvocationSync_Worker.ReportProgress(0, guiAction);
}
private void InvocationSync_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (IsDisposed) return; //we're in the GUI thread now, so no race condition right?
var action = (Action) e.UserState;
action();
}
public void SomeMethodCalledFromAnyThread() //Sample usage
{
InvokeViaSyncWorker(() => MyTextBox.Text = "Hello from another thread!"));
}
当然,这不是最经济的方法(像这样保持线程活跃),但如果它有效并且我没有错过任何东西,那肯定是我见过的最简单的方法。
非常感谢您的反馈!
【问题讨论】:
-
我也这么认为 :) 希望这是一个好兆头,它还没有被证伪
标签: c# .net winforms synchronization backgroundworker