任务指示 IsCompleted,即使它只是在等待
Task indicates IsCompleted even though it is just awaiting
我有以下示例代码。问题是,Task
表示 IsCompleted
,即使它只是 await
.
longTask
只有await
s(Task.Delay())还没完,那为什么IsCompleted
是真的呢? longTask
不能每一个都补完,因为夹在while(true)
?!
static async Task Main(string[] args)
{
Task longTask = Task.Factory.StartNew(async () =>
{
while (true)
{
long count = 0;
Console.WriteLine("doing hard work.");
while (count < 99999999)
{
count++;
}
Console.WriteLine("wait for a moment");
await Task.Delay(1000);
Console.WriteLine("I have waited enough");
}
});
while (true)
{
Console.WriteLine($"status: {longTask.IsCompleted}");
await Task.Delay(100);
}
}
如果您希望 longTask
代表内在的、永无止境的任务,请使用适当的设置调用 .Unwrap()
或使用具有合理默认值的 Task.Run
:
public static class Program
{
static async Task Main(string[] args)
{
Task longTask = Task.Factory.StartNew(async () =>
{
while (true)
{
long count = 0;
Console.WriteLine("doing hard work.");
while (count < 99999999)
{
count++;
}
Console.WriteLine("wait for a moment");
await Task.Delay(1000);
Console.WriteLine("I have waited enough");
}
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default).Unwrap();
while (true)
{
Console.WriteLine($"status: {longTask.IsCompleted}");
await Task.Delay(100);
}
}
}
或
public static class Program
{
static async Task Main(string[] args)
{
Task longTask = Task.Run(async () =>
{
while (true)
{
long count = 0;
Console.WriteLine("doing hard work.");
while (count < 99999999)
{
count++;
}
Console.WriteLine("wait for a moment");
await Task.Delay(1000);
Console.WriteLine("I have waited enough");
}
});
while (true)
{
Console.WriteLine($"status: {longTask.IsCompleted}");
await Task.Delay(100);
}
}
}
更多信息:MSDN & Startnew is Dangerous
我有以下示例代码。问题是,Task
表示 IsCompleted
,即使它只是 await
.
longTask
只有await
s(Task.Delay())还没完,那为什么IsCompleted
是真的呢? longTask
不能每一个都补完,因为夹在while(true)
?!
static async Task Main(string[] args)
{
Task longTask = Task.Factory.StartNew(async () =>
{
while (true)
{
long count = 0;
Console.WriteLine("doing hard work.");
while (count < 99999999)
{
count++;
}
Console.WriteLine("wait for a moment");
await Task.Delay(1000);
Console.WriteLine("I have waited enough");
}
});
while (true)
{
Console.WriteLine($"status: {longTask.IsCompleted}");
await Task.Delay(100);
}
}
如果您希望 longTask
代表内在的、永无止境的任务,请使用适当的设置调用 .Unwrap()
或使用具有合理默认值的 Task.Run
:
public static class Program
{
static async Task Main(string[] args)
{
Task longTask = Task.Factory.StartNew(async () =>
{
while (true)
{
long count = 0;
Console.WriteLine("doing hard work.");
while (count < 99999999)
{
count++;
}
Console.WriteLine("wait for a moment");
await Task.Delay(1000);
Console.WriteLine("I have waited enough");
}
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default).Unwrap();
while (true)
{
Console.WriteLine($"status: {longTask.IsCompleted}");
await Task.Delay(100);
}
}
}
或
public static class Program
{
static async Task Main(string[] args)
{
Task longTask = Task.Run(async () =>
{
while (true)
{
long count = 0;
Console.WriteLine("doing hard work.");
while (count < 99999999)
{
count++;
}
Console.WriteLine("wait for a moment");
await Task.Delay(1000);
Console.WriteLine("I have waited enough");
}
});
while (true)
{
Console.WriteLine($"status: {longTask.IsCompleted}");
await Task.Delay(100);
}
}
}
更多信息:MSDN & Startnew is Dangerous