我正在编写一个应用程序,其中我必须使用多个线程,每个线程都将执行一个任务,并且在该任务结束时将更新进度条以指示总体进度。问题是,因为我无法控制这些线程,它们可能会发生冲突,所以我使用了锁定作为预防措施,但也有人建议我使用以下代码或它的一些变体。我想听听你的意见,这段代码应该放在哪里。
var temp = updateProcess; //updateProcess is the event getting fired
if (temp != null)
{
var eventListeners = temp.GetInvocationList();
foreach (EventHandler e in eventListeners)
{
e.BeginInvoke(this, null, EndAsyncImageAcquiredEvent, null);
}
}
else
{
throw new FatalException("No handler is attached to the camera's ImageAcquiredEvent");
}我应该创建一个每个线程调用的单独方法,然后该方法使用此代码来触发每个事件更新,还是应该将此代码包含在每个线程执行的派生方法中。
提前感谢您的帮助
发布于 2013-06-04 17:44:42
您尝试获取的可能导致冲突的共享资源是什么?如果它是进度条,那么它只能通过UI线程本身进行更新,您所需要做的就是从线程中使用Invoke和InvokeRequired。请参阅:Using InvokeRequired vs control.InvokeRequired
如果您有任何其他共享资源,在使用锁时,如果操作正确(没有死锁等)代码将是线程安全的,但这将以性能为代价。
最后,我将使用任务而不是线程(请参阅:How to update UI from child tasks in WinForms
https://stackoverflow.com/questions/16914326
复制相似问题