Я читал этот документ https://docs.microsoft.com/en-us/dotnet/csharp/async, в котором говорится:
Для кода, связанного с вводом / выводом, вы ожидаете операцию, которая возвращает задачу или задачу внутри асинхронного метода.
У меня два вопроса:
Q1- для кода ввода-вывода, означает ли это, что нам нужно использовать Task.Factory.StartNew(..., TaskCreationOptions.LongRunning)
или TaskCompletionSource
Q2 - Я написал два простых консольных приложения ниже для имитации кода, связанного с вводом / выводом, мой подход правильный?
class Program //use Task.Factory.StartNew
{
static async Task Main(string[] args)
{
var task = ReadFile();
Console.WriteLine("Do other work");
int total = await task;
Console.WriteLine($"Read {total} lines");
Console.ReadLine();
}
static async Task<int> ReadFile()
{
return await Task.Factory.StartNew(new Func<int>(Read), TaskCreationOptions.LongRunning);
}
static int Read()
{
Thread.Sleep(5000); // simulate read operation
return 9999; // 9999 lines has been read
}
}
и
class Program // use TaskCompletionSource
{
static void Main(string[] args)
{
var awaiter = ReadFile().GetAwaiter();
Console.WriteLine("Do other work");
awaiter.OnCompleted(() => Console.WriteLine($"Read {awaiter.GetResult()} lines"));
Console.ReadLine();
}
static Task<int> ReadFile()
{
var tcs = new TaskCompletionSource<int>();
new Thread(() =>
{
tcs.SetResult(Read());
}).Start();
return tcs.Task;
}
static int Read()
{
Thread.Sleep(5000); // simulate read operation
return 9999; // 9999 lines has been read
}
}