C# 如何同时运行两个线程,当一个线程终止时,自动终止另一个线程
我有两个功能。我需要在有两个线程的单个线程上或在多个线程上启动它们,但我希望它们连接起来,这样一个线程就终止了,另一个线程也终止了C# 如何同时运行两个线程,当一个线程终止时,自动终止另一个线程,c#,multithreading,C#,Multithreading,我有两个功能。我需要在有两个线程的单个线程上或在多个线程上启动它们,但我希望它们连接起来,这样一个线程就终止了,另一个线程也终止了 public static void StartSocket() { Server myserver = new Server(*, ****); } public static void StartWeb() { CreateWebHostBuilder().Build().Run();
public static void StartSocket()
{
Server myserver = new Server(*, ****);
}
public static void StartWeb()
{
CreateWebHostBuilder().Build().Run();
}
例如`
Thread t1 = new Thread(StartSocket);
Thread t2 = new Thread(StartWeb);
t1.Start();
t2.Start();
如何在t2终止时终止t1,以及在t1终止时终止t2。不建议使用thread.Abort()停止线程 您应该有一个标志,指示何时必须终止线程,例如:
private static bool TerminateThreads = false;
public static void StartSocket()
{
Server myserver = new Server(*, ****);
while(!TerminateThreads)
{
try { ExecuteSomething(); }
catch { TerminateThreads = true; }
}
}
public static void StartWeb()
{
CreateWebHostBuilder().Build().Run();
while(!TerminateThreads)
{
try { ExecuteOtherSomething(); }
catch { TerminateThreads = true; }
}
}
不建议使用thread.Abort()停止线程 您应该有一个标志,指示何时必须终止线程,例如:
private static bool TerminateThreads = false;
public static void StartSocket()
{
Server myserver = new Server(*, ****);
while(!TerminateThreads)
{
try { ExecuteSomething(); }
catch { TerminateThreads = true; }
}
}
public static void StartWeb()
{
CreateWebHostBuilder().Build().Run();
while(!TerminateThreads)
{
try { ExecuteOtherSomething(); }
catch { TerminateThreads = true; }
}
}
如本文所述,已(严重)弃用
最优雅的方法是在async
任务上使用取消令牌
唯一的缺点是它不提供任何通知,您必须使用IsCancellationRequested
或throwifccancellationrequested
自己监控它。但另一方面,它非常方便,也很容易实现
一个非常基本的示例:
[测试]
公共无效终止其他未完成时()
{
var canceller=新的CancellationTokenSource();
int t1WaitDurationInSeconds=3;
int t2WaitDurationInSeconds=1;
var taskOne=Task.Run(()=>
{
尝试
{
//做那件事
控制台写入线(“T1工作…”);
//等一下。。。
等待任务。延迟(TimeSpan.FromSeconds(t1WaitDurationInSeconds),取消器。令牌);
//检查是否取消
canceller.Token.ThrowIfCancellationRequested();
//做更多的事情。。。
}
捕获(操作取消异常)
{
Console.WriteLine(“T1被中止”);
}
},取消者。令牌);
var taskTwo=Task.Run(()=>
{
尝试
{
//做那件事
控制台写入线(“T2工作…”);
//等一下。。。
wait Task.Delay(TimeSpan.FromSeconds(t2WaitDurationInSeconds),canceler.Token);
//检查是否取消
canceller.Token.ThrowIfCancellationRequested();
//做更多的事情。。。
}
捕获(操作取消异常)
{
控制台写入线(“T2被中止”);
}
},取消者。令牌);
var completedIndex=Task.WaitAny(taskOne,taskTwo);
WriteLine($“T{completedIndex+1}completed.”);
canceler.Cancel();
Task.Delay(TimeSpan.FromSeconds(2)).Wait();
}
产量将是
T1正在工作。。。T2正在工作。。。T2已完成。T1被中止
您可以更改等待时间,以测试首先完成T1也可以工作
希望这能有所帮助。如本文所述,已(严重)弃用
最优雅的方法是在async
任务上使用取消令牌
唯一的缺点是它不提供任何通知,您必须使用IsCancellationRequested
或throwifccancellationrequested
自己监控它。但另一方面,它非常方便,也很容易实现
一个非常基本的示例:
[测试]
公共无效终止其他未完成时()
{
var canceller=新的CancellationTokenSource();
int t1WaitDurationInSeconds=3;
int t2WaitDurationInSeconds=1;
var taskOne=Task.Run(()=>
{
尝试
{
//做那件事
控制台写入线(“T1工作…”);
//等一下。。。
等待任务。延迟(TimeSpan.FromSeconds(t1WaitDurationInSeconds),取消器。令牌);
//检查是否取消
canceller.Token.ThrowIfCancellationRequested();
//做更多的事情。。。
}
捕获(操作取消异常)
{
Console.WriteLine(“T1被中止”);
}
},取消者。令牌);
var taskTwo=Task.Run(()=>
{
尝试
{
//做那件事
控制台写入线(“T2工作…”);
//等一下。。。
wait Task.Delay(TimeSpan.FromSeconds(t2WaitDurationInSeconds),canceler.Token);
//检查是否取消
canceller.Token.ThrowIfCancellationRequested();
//做更多的事情。。。
}
捕获(操作取消异常)
{
控制台写入线(“T2被中止”);
}
},取消者。令牌);
var completedIndex=Task.WaitAny(taskOne,taskTwo);
WriteLine($“T{completedIndex+1}completed.”);
canceler.Cancel();
Task.Delay(TimeSpan.FromSeconds(2)).Wait();
}
产量将是
T1正在工作。。。T2正在工作。。。T2已完成。T1被中止
您可以更改等待时间,以测试首先完成T1也可以工作
希望这能有所帮助。到目前为止,您都做了哪些尝试?此外,如果您将代码发布到实际运行线程的位置,也会很有帮助。@RobinB完成,先生。谢谢。好的,那么在你的上下文中,终止到底是什么意思呢?如果
t1
首先完成,是否要中止t2
?或者,如果满足某个条件,您是否只想同时取消这两项?(这应该通过对它们两个调用Abort()
来解决。)。要找到解决方案,请查看而不是中止线程。您有没有注意到这一点:到目前为止,您尝试了什么?此外,如果您将代码发布到实际运行线程的位置,也会很有帮助。@RobinB完成,先生。谢谢。好的,那么在你的上下文中,终止到底是什么意思呢?如果t1
首先完成,是否要中止t2
?或者,如果满足某个条件,您是否只想同时取消这两项?(这应该通过对它们两个调用Abort()
来解决。)。对于解决方案,请查看而不是中止线程。您是否采取了