gpt4 book ai didi

c# - 同步方法中的异步调用

转载 作者:太空狗 更新时间:2023-10-29 21:29:47 24 4
gpt4 key购买 nike

这是一个简单的例子:

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();

但是我如何通过将方法的返回类型设置为 bool 值并在 Cookin 完成时返回结果来简化它?

if (CoockinRequest()) MessageBox.Show('Yay, smells even better');

如果我在其中放置类似while (bw.IsBusy) 的东西,它会破坏我的 ActivityIndi​​cator,卡住主线程,我觉得这将是最糟糕的事情。还有一些 Monitor.Wait 东西和一些其他东西,比如 TaskFactory,但是所有这些东西似乎都太复杂了,无法在简单的场景中使用。

它在不同的环境中也可能有所不同,例如某些方法适用于 WPF 应用程序,某些方法适用于其他内容等等,但应该有一个通用模式,不是吗?

你们是怎么做到的?

最佳答案

在 .NET 4 中没有直接的方法来执行此操作。这实际上非常符合下一版本的 C# 中的新异步/等待功能。

现在可以在 .NET 4 中使用任务并行库来完成此任务。您可以通过更改代码以返回 Task<bool> 来执行此操作,因此调用者可以等待它(如果需要),或订阅任务的继续,该任务将在完成时运行。

为此,您需要像这样重写上面的代码:

public Task<bool> CoockinRequestAsync()
{
var indicator = new ActivityIndicator();
ActivityIndicator.Show("Oooo coockin' something cool");

// This assumes Cook() returns bool...
var task = Task.Factory.StartNew(CockinService.Cook);

// Handle your removal of the indicator here....
task.ContinueWith( (t) =>
{
indicator.Hide();
}, TaskScheduler.FromCurrentSynchronizationContext());

// Return the task so the caller can schedule their own completions
return task;
}

然后,当你去使用它时,你会写这样的东西:

private void SomeMethod()
{
var request = this.CoockinRequestAsync();

request.ContinueWith( t =>
{
// This will run when the request completes...
bool result = t.Result;

// Use result as needed here, ie: update your UI

}, TaskScheduler.FromCurrentSynchronizationContext());
}

关于c# - 同步方法中的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7842180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com