2012-07-30 43 views
0

为了设置舞台,我有一个名为Scheduler的自定义类,它拥有多个Task对象(这也是一个自定义类)。每个任务都有一个BackgroundWorker对象来运行长时间运行的工作。我目前正在进行一些测试,让其中的许多任务能够快速执行并在同一时间处理。什么时候在执行时处理事件?

在我的Task对象中,我在TaskWorkerCompleted处理程序中引发自定义事件(TaskCompletedEvent)以提醒调度程序任务已完成。调度程序为每个任务的TaskCompletedEvent使用相同的事件处理程序。

我想知道的是,如果我目前在SchedulerTaskCompletedEvent处理程序执行代码和另一个事件结束,会发生什么?两者都将在UI线程上,那么当前在事件处理程序中的那个会在另一个之前完成呢?当两个事件同时完成并需要处理时,我会对将要发生的事情感到困惑。

+0

你是什么意思,两者都在UI线程上?如果它们在UI线程上,则它们不能同时完成。也许你的代码样本可能会有所帮助。 – svick 2012-07-30 16:36:16

+0

你究竟如何提升'TaskCompletedEvent'?你从UI线程做到这一点吗? – svick 2012-07-30 16:38:10

+0

@svick是的,我从UI线程中获取它。我认为弗拉德回答了我的问题。我只需要测试一些代码以确保正确理解它。 – Justin 2012-07-30 16:41:36

回答

1

不,事件本身不知道UI线程。所以这些事件将被派发到它们被解雇的同一个线程中(这很可能在后台工作的线程中,对吧?)

如果你的两个事件在UI线程中被触发,这不能同时发生(毕竟, UI线程正在执行一个或另一个事件触发代码),所以当第一个事件完成了触发和分派时,第二个事件可能会被触发。

如果您希望Scheduler将事件封送到UI线程,这是一个稍微不同的故事。你需要在UI线程中执行的代码实际上会被发布到该线程的一种事件队列中,并且无论事件触发代码发生在何处,都会首先执行。

+0

在UI线程上触发backgroundworker事件。我猜它使用Invoke。所以我不需要担心这两个事件同时处于同一个方法中,因为它们在同一个线程中,对吗? – Justin 2012-07-30 16:36:42

+0

@Justin:是的。 UI线程中的代码将按顺序执行;当第一个事件触发并且所有事件处理程序完成时,只有UI线程才会查找下一个已分派的命令,而不是同时查找。 – Vlad 2012-07-30 16:38:18