相关疑难解决方法(0)

"await Task.Run(); return;"之间的任何区别 并"返回Task.Run()"?

以下两段代码之间是否存在任何概念差异:

async Task TestAsync() 
{
    await Task.Run(() => DoSomeWork());
}
Run Code Online (Sandbox Code Playgroud)

Task TestAsync() 
{
    return Task.Run(() => DoSomeWork());
}
Run Code Online (Sandbox Code Playgroud)

生成的代码也不同吗?

编辑:为避免混淆Task.Run,类似的情况:

async Task TestAsync() 
{
    await Task.Delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

Task TestAsync() 
{
    return Task.Delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

最新更新:除了接受的答案之外,LocalCallContext处理方式也有所不同:即使没有异步,CallContext.LogicalGetData也会被恢复.为什么?

c# async-await

77
推荐指数
4
解决办法
3万
查看次数

在方法签名中使用async关键字在Web Api端点中返回Task

如果我想通过返回一个Task对象来编写一个非阻塞的web api动作,我可以使用或不使用async关键字这样做:

使用异步

public async Task<HttpResponseMessage> Get()
{
    Func<HttpResponseMessage> slowCall = () =>
    {
        Thread.Sleep(2000);
        return Request.CreateResponse(HttpStatusCode.OK, "Hello world");
    };

    var task = Task<HttpResponseMessage>.Factory.StartNew(slowCall);
    return await task;
}
Run Code Online (Sandbox Code Playgroud)

不使用异步

public Task<HttpResponseMessage> Get()
{
    Func<HttpResponseMessage> slowCall = () =>
    {
        Thread.Sleep(2000);
        return Request.CreateResponse(HttpStatusCode.OK, "Hello world");
    };

    var task = Task<HttpResponseMessage>.Factory.StartNew(slowCall);
    return task;
}
Run Code Online (Sandbox Code Playgroud)

他们都正常工作.但是,我在编写返回a的web api操作时看到的每个例子(在线和书中)都Task使用了async关键字.当然,我明白这会给你更大的灵活性,因为它可以让你控制你想要"等待"的东西,什么不是.但假设您的功能可以有效地处理,

  • 使用一种方法与另一种方法有什么好处吗?
  • 我应该总是使用async关键字(如果是这样的话)?
  • 或者它无关紧要?

.net c# task async-await asp.net-web-api

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

标签 统计

async-await ×2

c# ×2

.net ×1

asp.net-web-api ×1

task ×1