相关疑难解决方法(0)

使用`async` lambda与`Task.Run()`冗余?

我刚刚遇到了一些代码:

var task = Task.Run(async () => { await Foo.StartAsync(); });
task.Wait();
Run Code Online (Sandbox Code Playgroud)

(不,我不知道其内部运作方式Foo.StartAsync()).我最初的反应是摆脱async/ await并重写为:

var task = Foo.StartAsync();
task.Wait();
Run Code Online (Sandbox Code Playgroud)

这是否正确(再一次,一无所知Foo.StartAsync()). 这个答案与它有什么不同 - 用Task.Run运行'异步'动作委托......似乎表明可能存在可能有意义的情况,但它也说"说实话,我没有"看到很多场景......"

.net c# asynchronous task

17
推荐指数
2
解决办法
2万
查看次数

它有什么区别 - 使用Task.Run(vs默认操作委托)运行'async'操作委托?

我试图让我的头围绕异步/等待,并认为我确实理解了一些关于使用的事情.但仍然不太清楚在下面的场景中实际的好处是什么.

查看Task.Run用法.第一种方法使用普通委托并使用Thread.Sleep,但第二种方法使用'async'委托和Task.Delay.

我的问题是:这对这种方法有什么影响(或者它没有)?

该方法本身是一种异步方法.代码正在创建一个单独的线程(通过Task.Run),除了执行该委托之外,该线程没有其他任何操作.因此,即使它在Task.Delay上产生等待,在这种情况下有什么用处,因为线程无论如何都是一个孤立的线程没有用于任何其他东西,即使它只是使用Thread.Sleep,线程仍然是上下文切换到处理器的其他线程.

// The task thread uses a async delegate
public async Task<bool> RetrySendEmail(MailMessage message)
{
      bool emailSent = false;
      await (Task.Run(***async ()*** =>
      {
            for (int i = 0; i < 3; i++)
            {
                 if (emailSent)
                      break;
                 else
                      // Wait for 5 secs before trying again
                      ***await Task.Delay(5000);***

                 try
                 {
                      Smtphost.Send(message);
                      emailSent = true;
                      break;
                 }
                 catch (Exception e) { emailSent = false; // log; }
            }
            return emailSent;
      }));
}

// The task thread uses a …
Run Code Online (Sandbox Code Playgroud)

.net c# async-await .net-4.5

10
推荐指数
2
解决办法
3258
查看次数

标签 统计

.net ×2

c# ×2

.net-4.5 ×1

async-await ×1

asynchronous ×1

task ×1