c#单线程实现并行处理
时间: 2024-11-22 07:20:46 浏览: 16
在 C# 中,虽然单线程无法直接实现真正的并行处理,因为它的名字“Single Threaded”就表明了它一次只能运行在一个处理器核心上,但是通过一些技巧,可以模拟某种程度的并行效果。例如,你可以使用 `Task` 或 `Thread` 类以及异步编程模型(如 `async` 和 `await` 关键字),结合 `lock` 和 `Monitor` 对象来管理共享资源的并发访问,避免数据竞争。
下面是一个简单的例子,使用 `Task.Run` 创建一个任务,让代码在一个单独的线程上运行,看起来像是并行处理:
```csharp
using System;
using System.Threading.Tasks;
public class SingleThreadParallelExample
{
private static object _lock = new object();
public void PerformCalculations(int[] numbers)
{
var tasks = new Task[int] { };
for (int i = 0; i < numbers.Length; i++)
{
int number = numbers[i];
tasks[i] = Task.Run(() => ProcessNumber(number));
}
// 等待所有任务完成,顺序执行
await Task.WhenAll(tasks);
Console.WriteLine("All calculations finished.");
}
private async void ProcessNumber(int number)
{
lock (_lock)
{
Console.WriteLine($"Processing number {number}..."); // 这里是模拟并行工作的假象,实际还是串行
// 进行耗时操作...
await Task.Delay(500); // 模拟计算时间
}
}
public static void Main()
{
var numbers = Enumerable.Range(0, 10).ToArray();
var example = new SingleThreadParallelExample();
example.PerformCalculations(numbers);
}
}
```
在这个示例中,`ProcessNumber` 方法会被逐个放入独立的任务中执行,但实际上由于在同一全局锁 `_lock` 的控制下,它们是串行化的。这是为了演示如何在单线程中模拟并行,如果需要真正的并行处理,应该考虑使用 `Parallel.ForEach`、`Task Parallel Library (TPL)` 或 `ThreadPool`。
阅读全文