给我来一个C#多线程的实例,要求复杂一点。但是让我能理解。
时间: 2024-09-26 15:11:59 浏览: 37
在C#中,我们可以使用Thread类或Task类创建多线程程序。这里我会给你一个相对复杂的例子,涉及到异步操作、任务管理和同步锁定。
```csharp
using System;
using System.Threading.Tasks;
class Program
{
private static object _syncLock = new object();
private static int _counter = 0;
public static void IncrementCounter()
{
lock (_syncLock)
{
_counter++;
Console.WriteLine($"Incrementing counter ({_counter}) by thread {Thread.CurrentThread.ManagedThreadId}");
}
}
// 创建并启动两个并发的任务,它们会竞争访问共享资源
public static async Task Main(string[] args)
{
var task1 = Task.Factory.StartNew(IncrementCounter);
var task2 = Task.Factory.StartNew(() => IncrementCounter());
await Task.WhenAll(task1, task2); // 等待两个任务完成
Console.WriteLine("Both tasks completed, final counter: " + _counter);
// 示例中我们没有显式地同步对_counter的操作,因此可能存在竞态条件
// 如果你需要保证计数的一致性,应该考虑使用Monitor class 或者 Lock statement
}
}
```
在这个例子中:
- 我们有两个独立的任务 `task1` 和 `task2`,它们并发运行,各自尝试增加 `_counter` 的值。
- 通过 `lock` 关键字,我们将对 `_counter` 的修改操作进行了同步,防止了多个线程同时改变它导致的数据不一致。
- 使用 `Task.WhenAll` 等待两个任务都完成后,打印出最终的计数值。
- 注意,由于没有进行额外的同步处理,如果这两个任务非常接近于同时到达锁的位置,可能会看到交替增加的情况,这取决于JIT编译器和硬件环境。
阅读全文