如何避免任务阻塞主线程?

时间:2017-03-24 21:33:10

标签: c# multithreading task multitasking

假设您有以下代码:

Action action = () =>
{
  MethodThatReadSomeDataFromExternalHardware();
};

Task.Run(action);

MethodThatReadSomeDataFromExternalHardware()方法连接到硬件设备并返回一些数据。

哪种设备与问题无关。

现在,如果该硬件断开连接,则MethodThatReadSomeDataFromExternalHardware()方法会因尝试连接而陷入困境。

嗯......问题是当该方法卡住时,主线程也会卡住,直到发生硬件超时。

有没有办法避免这种情况?当然,这只是一个原子方法,所以我不能在其中添加一个循环或其他东西,以便在主线程中允许消息处理。

我怀疑这是不可能的,但我想知道是否有一些C#指令或Windows API来启动并行任务,如果该子进程被卡住,该任务不会影响主线程。

方面 海梅

1 个答案:

答案 0 :(得分:-2)

不要使用任务

如果你只是希望方法完成而不关心结果发生什么 - 或者 - 你可以在另一个线程中处理它;不要使用Tasks,因为它们比thread pool重,并且需要.Net 4.5

使用线程池

它可能比TPL有点旧,不那么花哨,但它符合要求。您使用ThreadPool的方式与使用Task的方式非常相似。而不是致电Run,而是致电QueueUserWorkItem

ThreadPool.QueueUserWorkItem(_ => {
   MethodThatReadSomeDataFromExternalHardwareAsync();
});

通过这种方式,您可以享受较轻的重量ThreadPool,并且您的代码更便携。