- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在 VS2012 框架 4.5 的表单上使用异步和等待命令。我的异步方法 SlowMethodAsync 不返回任何内容。请注意,此代码在控制台应用程序中运行良好。
private void button1_Click(object sender, EventArgs e)
{
var task = SlowMethodAsync();
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
System.Threading.Tasks.TaskStatus status = task.Status;
Console.WriteLine("Slow method result on Thread: {0}", task.Result); //This line never executes
Console.WriteLine("Main complete on {0}", Thread.CurrentThread.ManagedThreadId);
}
//Why is this method not returning anything?
static async Task<int> SlowMethodAsync()
{
Console.WriteLine("Slow method started on Thread: {0}", Thread.CurrentThread.ManagedThreadId);
await Task.Delay(2000);
Console.WriteLine("Slow method complete on Thread: {0}", Thread.CurrentThread.ManagedThreadId);
return 42;
}
最佳答案
你造成了僵局。
使用 task.Result
会阻塞 UI 线程 - 在 SlowMethodAsync
返回的任务完成之前它无法完成。
但是,因为 SlowMethodAsync
最初是在 UI 线程上使用同步上下文启动的,await
之后的延续 也 想要执行UI 线程。
因此 Result
在异步方法完成之前无法完成...并且在 Result
完成之前异步方法无法完成。
相反,您也应该使您的 button1_Click
方法异步,然后使用:
Console.WriteLine("Slow method result on Thread: {0}", await task);
这在控制台应用程序中起作用的原因是 SlowMethodAsync
方法不会有任何特定的同步上下文可以返回,因此延续可以在任何线程池线程上执行 -这不会被等待任务的“主”线程阻塞。
关于c# - 为什么我会收到 WaitingforActivation TaskStatus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690572/
我试图找出 async 和 await 关键字的全部内容,但是输出不是我所期望的。 控制台应用如下: class Program { static void Main(string[] arg
我有一个共享 BlockingCollection 的消费者/生产者设置。 public void StartConsumer(CancellationToken cancellationToken)
我有以下功能: async public Task checkNetwork (RestClient _client, ConnectivityManager conn) {
我发现 async 方法有一个非常令人困惑的行为。考虑以下控制台应用程序: private static int _i = 0; private static Task _calculateTask
我试图找出 async 和 await 关键字的全部内容,但是输出不是我所期望的。 控制台应用如下: class Program { static void Main(string[] arg
public void DoStuff() { // I want to be able to call the method DoAsynckStuff and wait for the r
我只有一种 Api Request 方法如下 private async Task getSiteAsync(string siteId) { Site site = null; va
我正在尝试在 VS2012 框架 4.5 的表单上使用异步和等待命令。我的异步方法 SlowMethodAsync 不返回任何内容。请注意,此代码在控制台应用程序中运行良好。 private void
我正在用下面的方式启动 wpf 任务 var newTask = Task.Factory.StartNew(() => { fcStartSubPageCrawl(srMainSiteURL, sr
我正在使用 TaskFactory 使用以下代码启动新任务。 var task = Task.Factory.StartNew(async () => { await Task.Run(()
我已经下载了 EF6 (为了使用 async) 所以我写了这个简单的方法: public async Task> MyasyncMethod() { var loc
我正在尝试发送 url 请求并异步获取响应,但是当我将 .fromAsync 方法与 .ContinueWith 方法一起使用时,任务状态永远不会从 WaitingForActivation 更改为运
我是 HttpClient 的新手。我下面的代码总是在状态中显示“WaitingForActivation”。请帮忙 private static async Task MakeCall() {
我是 C# 中的任务的新手。我正在尝试按照有关将 arm 模板部署到 azure 以启动虚拟机的示例进行操作: https://azure.microsoft.com/en-us/documentat
给定以下代码: Dim t As Date = Now Dim e As New AsynchronousExecutionEventArgs
我是 AWS 的新手,正在尝试设置我的系统以在预订后向最终用户发送 SMS 作为确认消息。 到目前为止,我在下面做了: AmazonSimpleNotificationServiceClient sm
我正在尝试使用 Azure 中的托管身份连接到我的 Key Vault。为此,我在 appsettings.json 的 KeyVault 下的 Vault 下添加了一个带有 Key Vault 名称
我是一名优秀的程序员,十分优秀!