相关疑难解决方法(0)

await task.run vs await c#

我在网上搜索过,看过很多关于task.run和等待异步的问题,但是有一个特定的使用场景,我并不是真的了解它的区别.我相信情景非常简单.

await Task.Run(() => LongProcess());
Run Code Online (Sandbox Code Playgroud)

VS

await LongProcess());
Run Code Online (Sandbox Code Playgroud)

其中LongProcess是一个异步方法,其中包含一些异步调用,例如调用db并等待ExecuteReaderAsync().

题:

这种情况下两者之间有什么区别吗?感谢任何帮助或意见,谢谢!

c# asynchronous async-await

14
推荐指数
3
解决办法
8178
查看次数

有问题的MVC控制器上的Async vs Sync基准测试

我已经在这篇MSDN文章中使用ASP.NET MVC 4中的使用异步方法设置了示例,并做了一些基准测试以了解我的想法.

服务器配置:

  • Windows 7专业版(x64)
  • IIS 7.5
  • 英特尔酷睿i7-2600S @ 2.80HGz
  • 8GB内存
  • AppPool>最大工作进程:10

我设置了2个控制器Sync,Async并使用加载器工具进行了基准测试.加载器工具只发送50-60个常量请求一分钟.每个控制器调用相同的Web服务3次.每个代码如下:


同步:

public ActionResult Sync()
{
    var g1 = GetGizmos("url1");
    var g2 = GetGizmos("url2");
    var g3 = GetGizmos("url3");
    return Content("");
}

public object GetGizmos(string uri)
{
    using (WebClient webClient = new WebClient())
    {
        return JsonConvert.DeserializeObject(
         webClient.DownloadString(uri)
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

同步

异步:

public async Task<ActionResult> Async()
{
    var g1 = GetGizmosAsync("url1");
    var g2 = GetGizmosAsync("url2");
    var g3 = GetGizmosAsync("url3");
    var a1 = await …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc asynchronous asp.net-mvc-4

9
推荐指数
1
解决办法
2165
查看次数

如何从Winforms按钮单击事件中调用异步方法?

我有一个要异步运行的I / O绑定方法。

帮助文档中,它提到我应该使用async并在没有Task.Run的情况下等待

报价

对于绑定到I / O的代码,您需要等待一个操作,该操作将在异步方法内部返回Task或Task。

如何从winforms按钮单击事件中执行此操作?

我试过了

private void button_Click(object sender, EventArgs e)
{ 
      await doLoadJob();
}

private async Task<int> doLoadJob()
{
    await loadJob();   
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c# async-await

2
推荐指数
1
解决办法
3623
查看次数

将方法转变为等待

我正在努力巩固我对异步和等待的理解.我终于理解了关于上下文切换的全部内容(这都是魔术).我写了一个简短的winform程序来玩它.请考虑以下事项

  private async void button1_Click(object sender, EventArgs e)
      {

        output.Text = "start";
        var intRet = await Task.Run(() => RunALot());
        output.Text += "   after run  ";
        output.Text += intRet.ToString();


    }

    private async Task<int> RunALot ()
    {

        int temp = 0;
        for (int ini = 0; ini <= 40000; ini++)
        {
            temp += ini;
        }
        return temp;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经有一个Task.Run我正在调用的时候我RunALot.是否需要将其内部包装RunALot到另一个内部Task.Runawait使其真正异步?嵌套上下文有任何性能影响 - 我可以在多大程度上嵌套上下文?

c# asynchronous async-await

1
推荐指数
2
解决办法
898
查看次数

如何将不可等待的操作传递给采用 Func&lt;Task&gt; 的方法?

假设我有一个方法如下......

public static async Task DoIt(Func<Task> doit) {
  // Do something first
  await doit();
  // Do something last
}
Run Code Online (Sandbox Code Playgroud)

我可以传递一个可等待的函数,如下所示......

await DoIt(() => Task.Delay(1000));
Run Code Online (Sandbox Code Playgroud)

如果我想传递一些不可等待的东西,我可以这样做......

_ = DoIt(() => Task.Run(() => Console.WriteLine("Hi")));
Run Code Online (Sandbox Code Playgroud)

......但这看起来很丑陋。有没有更简洁的方法来做到这一点?

c# async-await

1
推荐指数
1
解决办法
95
查看次数