【发布时间】:2011-10-20 21:00:10
【问题描述】:
这是一个简单的例子:
public event EventHandler CookinDone = delegate{};
public void CoockinRequest(){
var indicator = new ActivityIndicator();
ActivityIndicator.Show("Oooo coockin' something cool");
var bw = new BackgroundWorker();
bw.DoWork += (sender, e) => CockinService.Cook();
bw.RunWorkerCompleted += (sender, e) => {
indicator.Hide();
CookinDone.Invoke(this,null);
};
bw.RunWorkerAsync();
}
现在,每次我使用该方法时,我都必须拦截 CookinDone 事件并继续前进。
var cook = new Cook();
cook.CookinDone += (sender, e) => MessageBox.Show("Yay, smells good");
cook.CoockinRequest();
但是如何通过将方法的返回类型设置为布尔值并在 Cookin 完成时返回结果来简化这一点?
if (CoockinRequest()) MessageBox.Show('Yay, smells even better');
如果我把while (bw.IsBusy) 之类的东西放在那里,它会搞砸我的ActivityIndicator,冻结主线程,我觉得这将是最糟糕的事情。还有一些Monitor.Wait 的东西和一些其他的东西,比如TaskFactory,但是所有这些东西似乎都太复杂了,无法在简单的场景中使用。
在不同的环境中也可能有所不同,比如某些方法适用于 WPF 应用程序,有些方法适用于其他应用程序等等,但应该有一个通用模式不是吗?
你们是怎么做到的?
【问题讨论】:
-
让我们看看有没有人回答...
-
考虑看看异步 CTP;这是对未来如何在 C# 和 VB 中简化此类代码的一瞥。如果它不能满足您的需求,那么我们想在异步论坛上了解这一点。详情请见msdn.com/async。
-
天啊!是埃里克·利珀特!我爱你的博客先生!
-
有人知道异步 CTP 是否可以与 MonoTouch 一起使用吗?
-
@EricLippert:顺便说一句,我想知道,因为您似乎与 C# 5.0 中的异步内容有关。异步不是 .net 库功能,而不是 C# 功能吗?从 C# 的角度来看,这不仅仅是创建一个新的关键字并确保在编译时调用正确的代码片段吗?显然,我不知道这一切是如何结合在一起的,但我很想知道像 async 这样的东西与 TPL、PLINQ 等其他替代方案有何不同,在这些替代方案中,你没有像你的日常工作那样参与 AFAIK?
标签: c# multithreading c#-4.0