我在处理线程问题方面遇到了困难。问题出现在我通过foreach循环迭代时。
当设置
问题是,在我为第一个文件执行此操作之前,
我的问题是:如何暂停下一个线程,直到上一个线程完成。还有其他解决办法吗?
我尝试使用
下面是代码:
当设置
this.Document
时,应用程序会执行登录操作,该操作由事件触发,并需要几秒钟才能完成。在worker_RunWorkerCompleted
方法中,我需要执行一些依赖当前登录信息的操作。问题是,在我为第一个文件执行此操作之前,
this.Document
已经更改,使应用程序执行另一个登录。这样,我实际上无法执行我的操作。我的问题是:如何暂停下一个线程,直到上一个线程完成。还有其他解决办法吗?
我尝试使用
AutoResetEvent
,但没有成功。我在RunWorkerAsync调用后立即设置了waitOne()
和在RunWorkerCompleted中设置了.Set()
。代码从未进入RunWorkerCompleted
......。下面是代码:
public void Start(object obj)
{
try
{
foreach (KeyValuePair<string, Stream> pair in this.CollectionOfFiles)
{
Worker = new BackgroundWorker();
Worker.DoWork += new DoWorkEventHandler(worker_DoWork);
Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
using (Stream stream = pair.Value)
{
primaryDocument = new Document(stream);
DataHolderClass dataHolder = new DataHolderClass();
dataHolder.FileName = pair.Key;
dataHolder.Doc = secondaryDocument;
//background thread call
Worker.RunWorkerAsync(dataHolder);
}
}
}
catch (Exception ex)
{
// exception logic
}
finally
{
// complete logic
}
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
DataHolderClass dataHolder = ((DataHolderClass)e.Argument);
// setting this attribute triggers execution of login event
this.Document = dataHolder.Doc;
e.Result = (dataHolder);
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// here I need to perform some actions that are depending on the current login
DataHolderClass dataHolder = ((DataHolderClass)e.Result);
this.eventAggregator.GetEvent<ActionEvent>().Publish(new Message(EMessageType.Info) { Title = dataHolder.FileName });
}
RunWorkerCompleted
需要当前登录信息,则在同一线程中执行。如果它们在不同的线程中,则一个可能会在另一个之前完成,这就是线程设计的目的... - Dour High Arch