1.多线程的实现方式
1.1Thread实现
using System.Threading;
class SimpleThreadExample {
static void ThreadWork() {
for(int i = 0; i < 10; i++) {
Console.WriteLine($"Thread work: {i}");
Thread.Sleep(1000); // 模拟耗时操作
}
}
public static void Main() {
Thread t = new Thread(new ThreadStart(ThreadWork));
t.Start(); // 启动线程
Console.WriteLine("Main thread work...");
}
}
1.2Task实现
using System.Threading.Tasks;
class TPLExample {
static void DoWork(int value) {
for(int i = 0; i < 10; i++) {
Console.WriteLine($"Task work: {value} - {i}");
Task.Delay(100).Wait(); // 模拟耗时操作
}
}
public static void Main() {
Task t1 = Task.Run(() => DoWork(1));
Task t2 = Task.Run(() => DoWork(2));
Task.WaitAll(t1, t2); // 等待所有任务完成
Console.WriteLine("Main completed.");
}
}
1.3并行数据处理
using System.Threading.Tasks;
using System.Linq;
class ParallelForEachExample {
public static void Main() {
var numbers = Enumerable.Range(0, 100).ToArray();
Parallel.ForEach(numbers, number => {
Console.WriteLine($"Processing number: {number}");
// 执行操作
});
Console.WriteLine("Done processing all numbers.");
}
}
1.4线程安全
private object _lock = new object();
...
lock(_lock) {
// 执行临界区代码
}
2.文件操作
2.1写入文件
简单写入:
public async Task SimpleWriteAsync()
{
string filePath = "simple.txt";
string text = $"Hello World";
await File.WriteAllTextAsync(filePath, text);
}
有限控制示例:
public async Task ProcessWriteAsync()
{
string filePath = "temp.txt";
string text = $"Hello World{Environment.NewLine}";
await WriteTextAsync(filePath, text);
}
async Task WriteTextAsync(string filePath, string text)
{
byte[] encodedText = Encoding.Unicode.GetBytes(text);
using var sourceStream =
new FileStream(
filePath,
FileMode.Create, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true);
await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
}
2.2读取文件
简单读取:
public async Task SimpleReadAsync()
{
string filePath = "simple.txt";
string text = await File.ReadAllTextAsync(filePath);
Console.WriteLine(text);
}
有限控制示例:
public async Task ProcessReadAsync()
{
try
{
string filePath = "temp.txt";
if (File.Exists(filePath) != false)
{
string text = await ReadTextAsync(filePath);
Console.WriteLine(text);
}
else
{
Console.WriteLine($"file not found: {filePath}");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
async Task<string> ReadTextAsync(string filePath)
{
using var sourceStream =
new FileStream(
filePath,
FileMode.Open, FileAccess.Read, FileShare.Read,
bufferSize: 4096, useAsync: true);
var sb = new StringBuilder();
byte[] buffer = new byte[0x1000];
int numRead;
while ((numRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
string text = Encoding.Unicode.GetString(buffer, 0, numRead);
sb.Append(text);
}
return sb.ToString();
}
3.并发文件操作
3.1 同时创建多个文件
简单示例:
public async Task SimpleParallelWriteAsync()
{
string folder = Directory.CreateDirectory("tempfolder").Name;
IList<Task> writeTaskList = new List<Task>();
for (int index = 11; index <= 20; ++ index)
{
string fileName = $"file-{index:00}.txt";
string filePath = $"{folder}/{fileName}";
string text = $"In file {index}{Environment.NewLine}";
writeTaskList.Add(File.WriteAllTextAsync(filePath, text));
}
await Task.WhenAll(writeTaskList);
}
有限控制示例:
该示例将在任务完成后关闭 finally
块中的所有 FileStream 实例。 如果每个 FileStream
均已在 using
语句中创建,则可能在任务完成前释放 FileStream
。
public async Task ProcessMultipleWritesAsync()
{
IList<FileStream> sourceStreams = new List<FileStream>();
try
{
string folder = Directory.CreateDirectory("tempfolder").Name;
IList<Task> writeTaskList = new List<Task>();
for (int index = 1; index <= 10; ++ index)
{
string fileName = $"file-{index:00}.txt";
string filePath = $"{folder}/{fileName}";
string text = $"In file {index}{Environment.NewLine}";
byte[] encodedText = Encoding.Unicode.GetBytes(text);
var sourceStream =
new FileStream(
filePath,
FileMode.Create, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true);
Task writeTask = sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
sourceStreams.Add(sourceStream);
writeTaskList.Add(writeTask);
}
await Task.WhenAll(writeTaskList);
}
finally
{
foreach (FileStream sourceStream in sourceStreams)
{
sourceStream.Close();
}
}
}