m1o*_*1o2 8 .net c# multithreading asynchronous async-await
我开始学习C#5和.Net 4.5中的异步编程,有些东西我不明白.
private static int count;
public static void Main()
{
LoopTest();
Console.ReadKey(false);
}
static async void LoopTest()
{
count = 0;
for (var index = 0; index < 10; ++index)
{
Console.WriteLine( "({0}) In Loop before await, Index {1}, Thread: {2}", count++, index, Thread.CurrentThread.ManagedThreadId);
await Task.Factory.StartNew(() => Thread.Sleep(10));
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
(0) In Loop before await, Index 0, Thread: 9
(1) In Loop before await, Index 1, Thread: 10
(2) In Loop before await, Index 2, Thread: 11
(3) In Loop before await, Index 3, Thread: 10
(4) In Loop before await, Index 4, Thread: 11
(5) In Loop before await, Index 5, Thread: 10
(6) In Loop before await, Index 6, Thread: 12
(7) In Loop before await, Index 7, Thread: 11
(8) In Loop before await, Index 8, Thread: 10
(9) In Loop before await, Index 9, Thread: 12
Run Code Online (Sandbox Code Playgroud)
那么有不同的线程访问相同的循环吗?索引变量上有Race-Condition吗?
Ser*_*rvy 13
不,没有竞争条件.您启动一个将在后台运行的新任务,但在该任务完成之前您的代码将不会继续,因此您可以确保您的代码一次只能在一个线程中执行.
但是,因为这是一个控制台应用程序,所以没有最新的SyncronizationContext.(与winform,WPF,ASP,Silverlight等应用程序相对应.)这意味着任何await调用的延续都将在线程池中运行,而不是在调用线程中运行.所以,是的,你在循环的每次迭代中都在一个线程池线程中运行,并且每次都可能是不同的,但你可以确定,除了你在新任务中放置的任何内容之外,你将"完成"在开始处理下一个线程之前在任何给定线程上运行,这确保在任何给定时间只有一个线程运行代码(这意味着没有竞争条件).
| 归档时间: |
|
| 查看次数: |
9778 次 |
| 最近记录: |