-2
我在使用多線程時遇到了一個有趣的時刻。 我有兩個線程。在主線程中,我創建佈局並添加到它的控制中,在第二個線程中,我創建另一個控件並添加到相同的佈局。它工作正常,但第二個線程稍長一點,然後主要。所以主要應該等待第二個線程。我用這個AutoResetEvent
並得到了DeadLock。下面我介紹的代碼我用:帶鎖的死鎖工作
private static AutoResetEvent resetEvent = new AutoResetEvent(false);
private BackgroundWorker backgroundAdvancedViewWorker = new BackgroundWorker();
private delegate void ShowViewDelegate();
public void Run()
{
MainGeneralReportForm mainForm = ObjectFactory.GetOrCreateView<IMainGeneralReportForm>();
backgroundSimpleViewWorker.RunWorkerAsync(_mainForm);
GeneralReportFormatView formatView =
ObjectFactory.ShowView<IGeneralReportFormatView>()
resetEvent.WaitOne();
DoSomething(advancedSearchView);
}
private void backgroundAdvancedViewWorker_DoWork(object sender, DoWorkEventArgs e)
{
MainGeneralReportForm mainForm = e.Argument as MainGeneralReportForm;
if (mainForm!= null && mainForm.InvokeRequired)
{
mainForm.BeginInvoke(new ShowViewDelegate(() =>
{
advancedSearchView =
ObjectFactory.ShowView<IGeneralReportAdvancedSearchView>();
resetEvent.Set();
}));
}
}
}
如果主線程不等待第二個線程,應用程序引發NullReferenceException
。 該問題是否存在任何解決方法或解決方法?
[Thread.Join](https://msdn.microsoft.com/en-us/library/95hbf2ta%28v=vs.110%29.aspx)? –
沒有幫助。一樣的問題。 –
您的線程可能會產生反效果,WaitOne()最有可能阻止消息泵 – MickyD