相关疑难解决方法(0)

在异步方法结束时,我应该返回还是等待?

在任务返回异步方法结束时,如果我调用另一个异步方法,我可以使用await它或return它的任务.每个的后果是什么?

    Task FooAsync()
    {
        return BazAsync();  // Option A
    }

    async Task BarAsync()
    {
        await BazAsync(); // Option B
    }
Run Code Online (Sandbox Code Playgroud)

c# async-await

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

并行运行异步方法

我有一个异步方法,GetExpensiveThing()它执行一些昂贵的I/O工作.这就是我使用它的方式:

// Serial execution
public async Task<List<Thing>> GetThings()
{
    var first = await GetExpensiveThing();
    var second = await GetExpensiveThing();
    return new List<Thing>() { first, second };
}
Run Code Online (Sandbox Code Playgroud)

但由于这是一种昂贵的方法,我想并行执行这些调用.我本以为移动等待会解决这个问题:

// Serial execution
public async Task<List<Thing>> GetThings()
{
    var first = GetExpensiveThing();
    var second = GetExpensiveThing();
    return new List<Thing>() { await first, await second };
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,所以我将它们包装在一些任务中,这有效:

// Parallel execution
public async Task<List<Thing>> GetThings()
{
    var first = Task.Run(() =>
    {
        return GetExpensiveThing();
    });

    var second = Task.Run(() =>
    { …
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library async-await

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

是否在异步ASP.NET MVC 4操作的名称中需要"Async"后缀?

鉴于以下ASP.NET MVC 4控制器操作:

public async Task<ActionResult> FooAsync()
{
    using (var httpClient = new HttpClient())
    {
        var responseMessage = await httpClient.GetAsync("http://stackoverflow.com");
        string response = await responseMessage.Content.ReadAsStringAsync();

        return Content(response);
    }
}
Run Code Online (Sandbox Code Playgroud)

我是否需要在FooAsync添加 "Async"后缀才能异步运行操作?

asp.net-mvc asynchronous async-await asp.net-mvc-4

15
推荐指数
2
解决办法
4148
查看次数

始终在库中的异步方法中使用"async"和"await"关键字?

简介:在库方法中,何时应该使用asyncawait关键字而不是Task直接返回?

我相信我的问题与问题有关.但是,这个问题是关于.NET 4.0和TPL,而我正在使用.NET 4.6 asyncawait关键字.所以,我认为我的问题可能得到不同的答案,因为在回答链接问题时这些关键字不存在.

说明:我正在为外部WCF服务编写一个简单的包装器,并且包装器会进行多次SendAsync调用.现在我认为每个包装器方法都应该直接返回Task<>,而不必等待.我的理解是async/ await应该在应用层上使用,而不是在库中.

因此,例如,我认为我应该为每个包装器方法采用的方法:

private Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
    return _service.SendAsync(request);
}
Run Code Online (Sandbox Code Playgroud)

但是在互联网上,我找到了几个使用这种方法的帖子:

private async Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
    return await _service.SendAsync(request).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

这是我在technet上找到的另一个例子:

async Task PutTaskDelay()
{
    await Task.Delay(5000);
} 

private async void btnTaskDelay_Click(object sender, EventArgs e)
{
    await PutTaskDelay();
    MessageBox.Show("I am back");
}
Run Code Online (Sandbox Code Playgroud)

那么,我何时应该使用第二种方法(包含 …

.net c# asynchronous async-await .net-4.6

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

返回任务的命名方法的可接受模式是什么?

APM使用BeginXXX/EndXX对,基于事件的异步模式(EAP)使用XXXAsync和XXXCompleted对,但我没有看到任何关于如何命名返回任务的方法的标准.

我一直在使用XXXTask:

Data GetData() 
Task<Data> GetDataTask()
Run Code Online (Sandbox Code Playgroud)

但是想知道是否已经开发出更标准的方法

.net c# naming-conventions

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

如何解释这个“调用不明确”的错误?

问题

考虑这两个扩展方法,它们只是从任何类型T1到的简单映射T2,加上一个重载以流畅地映射到Task<T>

public static class Ext {
    public static T2 Map<T1, T2>(this T1 x, Func<T1, T2> f)
       => f(x);
    public static async Task<T2> Map<T1, T2>(this Task<T1> x, Func<T1, T2> f)
        => (await x).Map(f);
}
Run Code Online (Sandbox Code Playgroud)

现在,当我使用第二个重载映射到引用类型时......

var a = Task
    .FromResult("foo")
    .Map(x => $"hello {x}"); // ERROR

var b = Task
    .FromResult(1)
    .Map(x => x.ToString()); // ERROR
Run Code Online (Sandbox Code Playgroud)

...我收到以下错误:

CS0121:以下方法或属性之间的调用不明确:“Ext.Map(T1, Func)”和“Ext.Map(Task, Func)”

映射到值类型工作正常:

var c = Task
    .FromResult(1)
    .Map(x => x + 1); // works

var …
Run Code Online (Sandbox Code Playgroud)

c# generics overload-resolution

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

我是否需要在Visual Studio 2017 ASP.NET Core MVC中将Async添加到我的Controller操作中

我刚刚将Visual Studio 2015 ASP.NET MVC Core项目转换为Visual Studio 2017 ...我在错误列表中收到以下信息性消息

消息IDE1006命名规则违规:缺少后缀:'异步'

此消息出现在我的控制器中,重点关注以下内容:

public async Task<IActionResult> Index()
Run Code Online (Sandbox Code Playgroud)

这也适用于创建,删除,详细信息和编辑.消息显示为信息,并适用于我的项目中超过1,000次出现.看来我需要将Index改为IndexAsync ie.
改变自:

public async Task<IActionResult> Index()
public async Task<IActionResult> Create()
public async Task<IActionResult> Delete(int? id)
public async Task<IActionResult> Details(int? id)
Run Code Online (Sandbox Code Playgroud)

改成:

public async Task<IActionResult> IndexAsync()
public async Task<IActionResult> CreateAsync()
public async Task<IActionResult> DeleteAsync(int? id)
public async Task<IActionResult> DetailsAysnc(int? id)
Run Code Online (Sandbox Code Playgroud)

这似乎是可选的,因为我的项目将构建并且它不是VS 2015中的问题.我不介意做这项工作,我需要确认在Visual Studio 2017 ASP.NET Core中更改它是正确的方法.

asp.net-core-mvc visual-studio-2017

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

命名约定,C# 异步方法

应该在将要异步执行的方法名称中添加一个 Async 前缀。与在 MS EF Core 中一样,所有运行 async 的方法都有 async 前缀。但它们也有同步方法,没有同步前缀。

在某些方法设计为并行运行的情况下有什么建议。

寻求建议。

c# coding-style naming-conventions

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