多线程交叉线程

时间:2013-06-04 09:32:43

标签: c# multithreading thread-safety begininvoke

我正在编写一个应用程序,我必须使用多个线程,这些线程中的每一个都将执行任务,并在该任务结束时更新进度条以指示总体进度。问题是,因为我无法控制这些线程,他们可能会发生冲突,我已经使用锁定作为预防措施,但我也被建议使用以下代码,或其中的一些变体。我想了解您应该放置此代码的位置。

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");
        }

我应该创建一个每个线程调用的单独方法,然后该方法使用此代码来触发每个事件更新,或者此代码是否应包含在每个线程执行的spun out方法中。

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:2)

您尝试获取的可能导致冲突的共享资源是什么? 如果它是进度条,那么它只能通过UI线程本身更新, 您需要做的就是从线程中使用Invoke和InvokeRequired。 看到: Using InvokeRequired vs control.InvokeRequired

如果您有任何其他共享资源, 使用锁时,如果操作正确(没有死锁等等),代码将是线程安全的,但这会带来性能损失。

最后,我会使用任务而不是线程看到: How to update UI from child tasks in WinForms