相关疑难解决方法(0)

它有什么区别 - 使用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
查看次数

是否有任何理由在Task.Run中运行异步代码?

我最近在WinForm应用程序中遇到了这段代码,但我无法确定是否有任何理由asyncTask.Run等待中的内部运行代码。

public async Task SaveStuff()
{
    await Task.Run(() => SaveStuffAsync().ConfigureAwait(false));
    await Task.Run(() => SendToExternalApiAsync().ConfigureAwait(false));
}

private async Task SaveStuffAsync()
{
    await DbContext.SaveChangesAsync().ConfigureAwait(false);
}

private async Task SendToExternalApiAsync()
{
    // some async code that is awaited with ConfigureAwait(false);
}

Run Code Online (Sandbox Code Playgroud)

如果没有Task.Run,​​这段代码会不会做完全相同的事情?

public async Task SaveStuff()
{
    await SaveStuffAsync().ConfigureAwait(false);
    await SendToExternalApiAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

c# async-await

5
推荐指数
2
解决办法
128
查看次数

Task.Run 下是否需要 await / async 关键字?

我有一个包裹在 Task.Run 下的异步 lambda 表达式。但是,看起来我可以删除 async 和 await 关键字,它们会产生相同的结果。

t1 = Task.Run(() => DoSomethingExpensiveAsync());
t2 = Task.Run(() => DoSomethingExpensiveAsync());
await Task.WhenAll(t1, t2);
Run Code Online (Sandbox Code Playgroud)

对比

var t1 = Task.Run(async () => await DoSomethingExpensiveAsync());
var t2 = Task.Run(async () => await DoSomethingExpensiveAsync());
await Task.WhenAll(t1, t2);
Run Code Online (Sandbox Code Playgroud)
  1. 为什么编译器让我这样做以及幕后发生了什么?
  2. 是否存在添加它们会产生影响的情况?

c# task async-await

5
推荐指数
2
解决办法
161
查看次数

标签 统计

async-await ×3

c# ×3

.net ×1

.net-4.5 ×1

task ×1