我尝试了async / await的一些东西,但我真的没有得到它。我想要开始的所有内容是同时从两个不同的线程写入控制台。这是代码:
static void Main(string[] args)
{
DoSomethingAsync();
for (int i = 0; i < 1000; i++)
Console.Write(".");
Console.ReadLine();
}
static async void DoSomethingAsync()
{
Console.WriteLine("DoSomethingAsync enter");
//This does not seem good
await Task.Delay(1);
for (int i = 0; i < 1000; i++)
Console.Write("X");
Console.WriteLine("DoSomethingAsync exit");
}
使用简单但具有异步/等待的线程我只能在完成这个奇怪的时候完成它
await Task.Delay(1);
我看到的大多数基本例子都使用了它。但是,当你想做一些不同步的时间时,该怎么做?你不能等待任何东西,因此所有代码都在主线程上运行。 如何在不使用Task.Delay()的情况下实现与此代码相同的行为?
答案 0 :(得分:8)
并行和并发不是一回事。如果您希望并行执行for
循环,请使用Task.Run
将该工作卸载到另一个ThreadPool
线程:
static void Main(string[] args)
{
var task = Task.Run(() => DoSomething());
for (int i = 0; i < 1000; i++)
Console.Write(".");
task.Wait()
}
static void DoSomething()
{
for (int i = 0; i < 1000; i++)
Console.Write("X");
}
async-await
用于异步操作,可能同时运行,但必然。
答案 1 :(得分:0)
您可以使用async Task
方法并在生成的任务上调用Wait
。这会奏效。但是,它会引入并发性,因为在线程池上提供了计时器滴答。我不确定控制台的线程安全性是什么。
Consider setting up a single threaded synchronization context.这样的事情就像一个UI线程。您的所有代码都运行单线程,但您可以执行多个异步方法。