AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
Console.WriteLine("未处理异常:" + (args.ExceptionObject as Exception)?.Message);
};
Thread thread = new Thread(() =>
{
throw new InvalidOperationException("测试异常");
});
thread.Start();
// 线程中抛出的异常不会自动传播到主线程!
线程同步与锁结合使用(lock + Thread)
private static readonly object _sync = new object();
private static int _counter = 0;
Thread t1 = new Thread(() =>
{
for (int i = 0; i < 1000; i++)
{
lock (_sync)
{
_counter++;
}
}
});
Thread t2 = new Thread(() =>
{
for (int i = 0; i < 1000; i++)
{
lock (_sync)
{
_counter--;
}
}
});
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine(_counter); // 应该输出 0
使用 ParameterizedThreadStart 传参(带对象)
class Person
{
public string Name { get; set; }
}
Thread thread = new Thread((obj) =>
{
var person = obj as Person;
Console.WriteLine($"你好,{person.Name}");
});
thread.Start(new Person { Name = "张三" });
使用 Thread.Join(TimeSpan) 实现超时等待
Thread thread = new Thread(() =>
{
Thread.Sleep(3000);
Console.WriteLine("线程完成");
});
thread.Start();
bool finished = thread.Join(TimeSpan.FromSeconds(2));
if (!finished)
{
Console.WriteLine("线程仍在运行,超时");
}
使用 AutoResetEvent 或 ManualResetEvent 实现线程通信
AutoResetEvent waitHandle = new AutoResetEvent(false);
Thread worker = new Thread(() =>
{
Console.WriteLine("等待信号...");
waitHandle.WaitOne();
Console.WriteLine("收到信号,开始工作");
});
worker.Start();
Thread.Sleep(2000);
waitHandle.Set(); // 发送信号
var signal = new ManualResetEvent(false);
Thread worker = new Thread(() =>
{
Console.WriteLine("工作线程开始");
Thread.Sleep(2000);
Console.WriteLine("工作线程完成");
signal.Set(); // 发送信号
});
worker.Start();
Console.WriteLine("主线程等待...");
signal.WaitOne(); // 等待信号
Console.WriteLine("主线程继续");
int workerThreads, completionPortThreads;
ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
Console.WriteLine($"可用线程池线程数:{workerThreads}");
public ValueTask<int> ComputeAsync(int a, int b, CancellationToken ct = default)
{
if (ct.IsCancellationRequested)
return new ValueTask<int>(Task.FromCanceled<int>(ct));
return new ValueTask<int>(a + b);
}
public Task<int> DelayedResultAsync()
{
var tcs = new TaskCompletionSource<int>();
new Thread(() =>
{
Thread.Sleep(1000);
tcs.SetResult(42);
}).Start();
return tcs.Task;
}
无评论