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。有了这个,你就可以报告进度了。