復制代碼 代碼如下:
public class Example
{
public static void Main()
{
CancellationTokenSource cts = new CancellationTokenSource();
var thread = new Thread(ThreadWork);
thread.Start(cts.Token);
while (true)
{
if(Console.ReadKey().KeyChar == 'c')
{
Console.WriteLine("請求取消線程的執行");
cts.Cancel();
break;
}
}
Console.ReadLine();
}
private static void ThreadWork(object state)
{
CancellationToken cancellationToken = (CancellationToken)state;
while (true)
{
// 檢查是否取消
if(cancellationToken.IsCancellationRequested)
{
Console.WriteLine("線程已經取消了");
Console.WriteLine("線程的資源已經清理完成。");
break;
}
// 模擬工作
Thread.SpinWait(500000);
Console.WriteLine("我還在工作。");
}
}
}
復制代碼 代碼如下:
public class Example
{
private static int Value;
public static void Main()
{
var autoResetEvent = new AutoResetEvent(false);
var cts = new CancellationTokenSource();
var state = new { ValueAvailableEvent = autoResetEvent, CancellationToken = cts.Token };
var threadConsumer = new Thread(ConsumerThreadWork);
var threadProducter = new Thread(ProducterThreadWork);
threadConsumer.Start(state);
threadProducter.Start(state);
while (true)
{
if (Console.ReadKey().KeyChar == 'c')
{
Console.WriteLine("請求取消線程的執行");
cts.Cancel();
break;
}
}
Console.ReadLine();
}
public static void ProducterThreadWork(dynamic state)
{
var valueAvailableEvent = (AutoResetEvent)state.ValueAvailableEvent;
var cancellationToken = (CancellationToken)state.CancellationToken;
var rand = new Random();
while (!cancellationToken.IsCancellationRequested)
{
Value = rand.Next();
Console.WriteLine("/r/n產生一個值{0}", Value);
valueAvailableEvent.Set();
Thread.Sleep(500);
}
Console.WriteLine("生產者線程被取消。");
}
public static void ConsumerThreadWork(dynamic state)
{
var valueAvailableEvent = (AutoResetEvent)state.ValueAvailableEvent;
var cancellationToken = (CancellationToken)state.CancellationToken;
var events = new[] { valueAvailableEvent, cancellationToken.WaitHandle };
while (true)
{
var eventIndex = WaitHandle.WaitAny(events);
// 處理數據
if (eventIndex == 0)
{
Console.WriteLine("處理值{0}。", Value);
}
// 處理取消事件
else if (eventIndex == 1)
{
Console.WriteLine("消費者線程被取消。");
break;
}
}
}
}
新聞熱點
疑難解答
圖片精選