【问题标题】:Wait for an event to finish (threading)等待事件完成(线程)
【发布时间】:2013-12-11 09:41:21
【问题描述】:

我需要等待事件完成才能继续。

这是我的代码:

foreach (KeyValuePair<string, Stream> pair in this.XMLCollection)
{
    ...
    this.eventAggregator.GetEvent<LogToApplicationEvent>().Publish(credentials);
    //wait 
    ...
}

在继续之前,我需要等待“登录”事件完全执行。 我尝试使用Task.Factory,但它对我不起作用,或者我无法正确使用它...

此代码在 Presenter 上,但该事件会更新主 UI。

//publish
public virtual void Publish(TPayload payload)
{
   base.InternalPublish(payload);
}

【问题讨论】:

  • Publish的签名是什么?

标签: c# .net wpf multithreading


【解决方案1】:

至少有两种可能的解决方案:

后台工作人员

使用BackgroundWorker 执行您的代码,并使用RunWorkerCompleted 事件执行完成后运行的代码。

BackgroundWorker 将基于事件的异步模式包装成一个非常易于使用的机制,包括进度报告和取消。请参阅此BackgroundWorker tutorial 和此 SO 答案。

任务(.NET 4.0 及更高版本)

使用Task对象,并使用ContinueWith方法定义第一个任务完成后需要执行的代码。

【讨论】:

    【解决方案2】:

    Event Aggregator 发布和订阅事件模式是synchronous。你不必担心。

    因此,在其订阅者完成执行其委托之前,它不会恢复。

    假设 - 您正在使用 Microsoft 提供的内置 Event Aggregator 类。

    【讨论】:

    • 但确实如此......事件背后的代码尝试执行某些操作但由于未执行登录而失败。实际上,如果我观察到 UI 登录事件以几秒钟的延迟触发(它会打开一个弹出窗口)
    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2015-08-29
    • 2011-06-09
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多