3

在阅读Async and Await (C# and Visual Basic) 的异步编程之后,我希望我的 GUI 不会挂起

    public async Task<string> DoBusyJob()
    {
        // Busy Job
        Thread.Sleep(10000);
        i++;
        return "Finished " + i;
    }

    int i = 0;

    private async void button1_Click(object sender, EventArgs e)
    {
        // Hang!
        string result = await DoBusyJob();

        this.label1.Text = result;
    }

但是,事实并非如此。它仍然挂起。我意识到我需要添加额外awaitDoBusyJob

    public async Task<string> DoBusyJob()
    {
        // Busy Job
        await Thread.Sleep(10000);
        i++;
        return "Finished " + i;
    }

    int i = 0;

    private async void button1_Click(object sender, EventArgs e)
    {
        // OK!
        string result = await DoBusyJob();

        this.label1.Text = result;
    }

我可以知道为什么会这样吗?我真的需要double await吗?如果出现以下情况怎么办?

    public async Task<string> DoBusyJob()
    {
        // How to prevent Hang?
        for (int j = 0; j < 10000000; j++) {
            double m = Math.Sqrt(1) + Math.Sqrt(2) + Math.Sqrt(3);
        }
        i++;
        return "Finished " + i;
    }

    int i = 0;

    private async void button1_Click(object sender, EventArgs e)
    {
        // Hang!
        string result = await DoBusyJob();

        this.label1.Text = result;
    }
4

3 回答 3

6

请参阅有关方法的此问题的出色答案async

如果您没有使用已经异步的方法,则添加async不足以使您的方法异步执行。await在这种情况下,您需要返回一个Task代表您的工作执行的实例,例如。通过调用Task.Factory.StartNew.

于 2012-10-18T04:17:36.933 回答
2

async/ awaitFAQ中有一个很好的答案:

问:在方法上使用“async”关键字是否会强制对该方法的所有调用都是异步的?

A. 不会。当您调用标记为“async”的方法时,它会开始在当前线程上同步运行...

问:“async”关键字是否会导致方法调用排队到 ThreadPool?创建一个新线程?向火星发射火箭飞船?

A. 不。不。而且不...

您可能会发现我的async/await介绍很有帮助。

于 2012-10-18T13:17:12.233 回答
0

我希望我能理解你// OK!添加 awaitThread.Sleep(10000);
它不可能等待方法Sleep()返回void
只能等待指定其签名TaskTask<TResult>作为返回类型 的方法

异步方法在没有(或直到)的情况下同步执行,await因此阻塞 UI 线程
await Task.Run() 应立即返回到(先前的)UI 同步上下文,即继续下一个 i++;行执行

public async Task<string> DoBusyJob()
{
  // Busy Job

  await Task.Run(() =>
    {
        for (int j = 0; j < 10000000; j++)
        {
            double m = Math.Sqrt(1) + Math.Sqrt(2) + Math.Sqrt(3);
        }
    }
                );
  i++;
  return "Finished " + i;
}
于 2013-05-05T18:30:37.747 回答