Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何同时运行两个线程,当一个线程终止时,自动终止另一个线程_C#_Multithreading - Fatal编程技术网

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()
来解决。)。对于解决方案,请查看而不是中止线程。您是否采取了