相关疑难解决方法(0)

如何同步运行异步Task <T>方法?

我正在学习async/await,并遇到了需要同步调用异步方法的情况.我怎样才能做到这一点?

异步方法:

public async Task<Customers> GetCustomers()
{
    return await Service.GetCustomersAsync();
}
Run Code Online (Sandbox Code Playgroud)

正常使用:

public async void GetCustomers()
{
    customerList = await GetCustomers();
}
Run Code Online (Sandbox Code Playgroud)

我尝试过使用以下内容:

Task<Customer> task = GetCustomers();
task.Wait()

Task<Customer> task = GetCustomers();
task.RunSynchronously();

Task<Customer> task = GetCustomers();
while(task.Status != TaskStatus.RanToCompletion)
Run Code Online (Sandbox Code Playgroud)

我也从这里尝试了一个建议,但是当调度程序处于暂停状态时它不起作用.

public static void WaitWithPumping(this Task task) 
{
        if (task == null) throw new ArgumentNullException(“task”);
        var nestedFrame = new DispatcherFrame();
        task.ContinueWith(_ => nestedFrame.Continue = false);
        Dispatcher.PushFrame(nestedFrame);
        task.Wait();
}
Run Code Online (Sandbox Code Playgroud)

以下是调用的异常和堆栈跟踪RunSynchronously:

System.InvalidOperationException

消息:可能无法在未绑定到委托的任务上调用RunSynchronously.

InnerException:null

资料来源:mscorlib …

c# asynchronous async-await c#-5.0

606
推荐指数
16
解决办法
36万
查看次数

在等待任务结果时会发生什么?

我正在使用HttpClient将数据发布到.NET 4.0项目中的远程服务.我不关心这个操作阻塞,所以我想我可以跳过ContinueWith或async/await并使用Result.

在调试时,我遇到了远程服务器没有响应的问题.当我逐步完成代码时,似乎我的代码在第三行停止运行...当前堆栈指针线停止突出显示为黄色,并且没有前进到下一行.它刚刚消失了.我花了一段时间才意识到我应该等待请求超时.

var client = new HttpClient();
var task = client.PostAsync("http://someservice/", someContent);
var response = task.Result;
Run Code Online (Sandbox Code Playgroud)

我的理解是调用任务上的Result导致代码同步执行,表现得更像这样(我知道HttpClient中没有Post方法):

var client = new HttpClient();
var response = client.Post("http://someservice/", someContent);
Run Code Online (Sandbox Code Playgroud)

我不确定这是件坏事,我只是试图理解它.真的是因为HttpClient正在返回Tasks而不是直接返回结果,我的应用程序即使在我认为我正在避免它时也会自动利用异步吗?

c# asynchronous task

36
推荐指数
1
解决办法
3万
查看次数

标签 统计

asynchronous ×2

c# ×2

async-await ×1

c#-5.0 ×1

task ×1