[英]C# task.wait method called not finished
我试图更好地理解C#中的“任务”和“异步”操作,并且正在运行此示例程序,但是我对输出感到困惑。 当我运行此命令时,有时程序不会在CallMethod中输出Console输出
int length = await task
有时会,但是当我取消评论时
Console.ReadLine()
它始终运行所有CallMethod。
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace Tasks1
{
class Program
{
static void Main(string[] args)
{
Task task = new Task(CallMethod);
task.Start();
task.Wait();
//Console.ReadLine();
}
static async void CallMethod()
{
string filePath = "/Users/testname/Projects/Tasks1/Tasks1/Sample.txt";
Task<int> task = ReadFile(filePath);
Console.WriteLine("Other Work 1");
Console.WriteLine("Other Work 2");
Console.WriteLine("Other Work 3");
int length = await task;
Console.WriteLine(" Total Length: " + length);
Console.WriteLine("After work 1");
Console.WriteLine("After work 2");
}
static async Task<int> ReadFile(string file)
{
int length = 0;
Console.WriteLine("File reading is starting");
using (StreamReader reader = new StreamReader(file))
{
string s = await reader.ReadToEndAsync();
length = s.Length;
}
Console.WriteLine("File reading is complete");
return length;
}
}
}
async void
-始终是async void
:)基本上,除非您非常了解使用它的原因,否则不要使用async void
。 调用路径无法知道async void
的完成状态,因此从调用方的角度来看,它将运行到第一个非同步await
。 在那之后,您将处于线程竞争的情况。 它不能参与最外面的Wait()
(或await
),因为它不报告状态。 当所有非后台线程完成时,exe将退出,因此:有时它可能会起作用,但多数情况下不会起作用。 添加Console.ReadLine()
迫使它等待更长的时间,因此它可以工作。
基本上:使CallMethod
返回Task
。
顺便说一句:使用最新的C#版本,您也可以使Main
方法async
:
static async Task Main(string[] args) {...}
然后,您可以在Main
await
。 您应该对一个任务执行Wait()
的次数几乎为零; 通常你应该喜欢await
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.