C# 多线程交叉线程
我正在编写一个应用程序,其中我必须使用多个线程,每个线程将执行一个任务,并在该任务结束时更新一个进度条,以指示总体进度。问题是,因为我无法控制这些线程,它们可能会发生冲突,所以我使用锁定作为预防措施,但也有人建议我使用以下代码或其变体。我想听听你的意见,这个代码应该放在哪里C# 多线程交叉线程,c#,multithreading,thread-safety,begininvoke,C#,Multithreading,Thread Safety,Begininvoke,我正在编写一个应用程序,其中我必须使用多个线程,每个线程将执行一个任务,并在该任务结束时更新一个进度条,以指示总体进度。问题是,因为我无法控制这些线程,它们可能会发生冲突,所以我使用锁定作为预防措施,但也有人建议我使用以下代码或其变体。我想听听你的意见,这个代码应该放在哪里 var temp = updateProcess; //updateProcess is the event getting fired if (temp != null) {
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");
}
我应该创建每个线程调用的单独方法,然后该方法使用此代码触发每个事件更新,还是应该将此代码包含在每个线程执行的spin out方法中
提前感谢您的帮助您试图获取的可能导致冲突的共享资源是什么? 如果是进度条,则只能通过UI线程本身进行更新, 您所需要做的就是使用Invoke和invokererequired从您的线程。 见: 如果您有任何其他共享资源, 使用锁时,如果操作正确(无死锁等),代码将是线程安全的,但这将以性能为代价 最后,我将使用任务而不是线程参见:
为什么要重新发明轮子而不使用任务库?您是否尝试过使用BackgroundWorker。有了这个,你就可以报告进度了。