0

我正在编写一个应用程序,我必须使用多个线程,这些线程中的每一个都将执行一个任务,并在该任务结束时更新一个进度条以指示整体进度。问题是,因为我无法控制这些线程,它们可能会发生冲突,所以我使用锁定作为预防措施,但我也被建议使用以下代码或它的一些变体。我想听听你对这段代码应该放在哪里的意见。

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 方法中。

提前感谢您的帮助

4

1 回答 1

2

您尝试获取的可能导致冲突的共享资源是什么?如果是进度条,则只能通过 UI 线程本身进行更新,您只需使用线程中的 Invoke 和 InvokeRequired 即可。请参阅: 使用 InvokeRequired 与 control.InvokeRequired

如果您有任何其他共享资源,则在使用 lock 时,如果正确完成(没有死锁等),代码将是线程安全的,但这会以性能为代价。

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

于 2013-06-04T09:44:42.450 回答