1

我有一个用户控件,其中逐渐出现一条消息,几秒钟后它会再次消失。此控件使用 backgroundWorker。它工作正常。但是我应该为负责将消息显示为的方法添加一个重载:

ShowMessage(string message, bool waitToHide) { .. }

现在,我需要知道让调用线程(UI 线程)等待上述方法的最佳方法是什么。


我试图引发一个事件来通知调用范围内部的backgroundWorker已经完成,但是由于这种方法在主应用程序中已经被频繁使用,我必须将许多统一的范围分解成一些分散的范围。

{
    // before code snippet..
    messageDisplayer1.ShowMessage("test", true);
    // after code snippet..
}

将转向:

{
    // before..
    messageDisplayer1.ShowMessage("test", true);
}

void messageDisplayer1_Done()
{
    // after..
}
4

1 回答 1

3

如果您必须在没有异步 CTP 的情况下坚持使用 .NET 3.5 或 .NET 4,我认为您将无法避免拆分代码(除非您想用DoEvents乱扔代码,这绝对不推荐)。

另一方面,异步扩展(.NET 4 的 CTP 或 .NET 4.5 中包含的版本)允许您执行以下操作:

{ 
    // before code snippet.. 
    await messageDisplayer1.ShowMessage("test", true); 
    // after code snippet.. 
} 

然后编译器会自动将您的“后代码片段”放入一个单独的代码块(一个continuation)中,该代码块在 ShowMessage 发出完成信号后立即运行。同时,控制权返回到 Windows 消息循环,让程序的 UI 响应。

于 2012-04-04T08:09:12.027 回答