gpt4 book ai didi

c# - 为基本线程同步配置 WaitHandle

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:28 25 4
gpt4 key购买 nike

根据文档,.NET 中的 WaitHandle 应该显式/隐式处理。但是,我在实现以下基本同步任务时遇到了麻烦:

  • 一个耗时的任务正在一个线程上执行。
  • 主线程在预定义的时间段内等待任务完成。如果 a. 主线程必须继续。任务完成或 b.发生超时。

这里我尝试使用 AutoResetEvent 对象:

using(var waitHandle = new AutoResetEvent(false)){
var worker = new Thread(() =>
{
try
{
TimeConsumingTask();
waitHandle.Set(); //throws System.ObjectDisposedException: Safe handle has been closed
}
catch (Exception e)
{...}
}) {IsBackground = true};
worker.Start(); //start worker

const int waitTimeInMs = 5000;
var signaled = waitHandle.WaitOne(waitTimeInMs);//block main thread here.
if (!signaled)
{ //if timed out
worker.Interrupt();
}
}

有一个明显的竞争条件,主线程等待超时并释放导致 ObjectDisposedException 异常的等待句柄对象。有没有其他方法可以设置它,以便正确处理句柄并且不会导致异常?

最佳答案

当然,没有合适的方法可以做到这一点。请预先注意,您通过本质上让线程疯狂运行而将自己画在那个角落,这没什么特别好的。

但是您关注的是小得多的问题。 Thread 类本身已经是一个资源消耗者,消耗 1 兆字节的 VM 和五个同步对象。但是它没有 Dispose() 方法。这是一个大胆的设计,只是没有合适的方法来调用该方法。

Disposing 是可选的,当您不调用它时,不会发生任何戏剧性的事情。这个类得到了你的支持,它有一个终结器来确保 native 操作系统资源将被释放。哪个最终会运行,只是没有您想要的那么快。

将此与设计不那么大胆的类进行比较,Task 类有一个 Dispose() 方法。与 Thread 一样,它几乎同样难以调用。 guidance from the .NET gurus就是不打扰。

这里也一样。

关于c# - 为基本线程同步配置 WaitHandle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23039999/

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