gpt4 book ai didi

c# - 在不同线程中抛出异常时在当前线程中捕获异常

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:31 24 4
gpt4 key购买 nike

我的情况是:

我从主线程启动线程 A。在主线程中有一些 while(true) 运行了很多时间。 while里面是耗时操作:

    static void Main(string[] args)
{
new Thread(Go).Start();

while (true)
{
Thread.Sleep(1000);
}
}

private static void Go()
{
}

如果线程 A 出现问题,我希望在主线程中生成异常

我读了一些文章,例如这篇文章:catch exception that is thrown in different thread

唯一的答案是:使用共享变量(one of answers)

所以,解决方案:

    static void Main(string[] args)
{
new Thread(Go).Start();

while (true)
{
Thread.Sleep(1000);

if (_bad)
{
throw new Exception();
}
}
}

private static void Go()
{
Thread.Sleep(4000);
_bad = true;
}

是 Not Acceptable ,因为我希望尽快得到异常(exception)。不等待循环循环。例如,如果我在 while 循环中做 cookies ,我不想在加热时等待下一个循环:当加热器坏了时,我希望在同一时刻在主线程中生成异常。

现在,我无法将委托(delegate)传递给线程:如果我从线程 A 调用委托(delegate),则无法切断 while 循环,因为它是另一个线程。事件也是如此。

我该如何处理这个问题?

谢谢

最佳答案

实现此目的的最佳方法是使用任务并行库。如果您使用 TaskCreationOptions.LongRunning 开始您的任务,将创建一个新线程来执行任务的主体。然后您可以访问 Task<T>.Result或调用Wait从主线程,异常(如果有的话)将传播回线程。使用 CancellationTokenSource支持取消与 Go 同时执行的其他操作操作。

在以下示例中,调用 Thread.Sleep是特定于应用程序的耗时操作的占位符。

private static CancellationTokenSource _cancellationTokenSource =
new CancellationTokenSource();

static void Main(string[] args)
{
Task longRunning = Task.Factory.StartNew(Go, TaskCreationOptions.LongRunning);
while (true)
{
// Pass _cancellationTokenSource.Token to worker items to support
// cancelling the operation(s) immediately if the long running
// operation throws an exception
Thread.Sleep(1000);

// this will throw an exception if the task faulted, or simply continue
// if the task is still running
longRunning.Wait(0);
}
}

private static void Go()
{
try
{
Thread.Sleep(4000);
throw new Exception("Oh noes!!");
}
catch
{
_cancellationTokenSource.Cancel();
throw;
}
}

关于c# - 在不同线程中抛出异常时在当前线程中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22921408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com