假设您有以下代码:
Action action = () =>
{
MethodThatReadSomeDataFromExternalHardware();
};
Task.Run(action);
MethodThatReadSomeDataFromExternalHardware()方法连接到硬件设备并返回一些数据。
哪种设备与问题无关。
现在,如果该硬件断开连接,则MethodThatReadSomeDataFromExternalHardware()方法会因尝试连接而陷入困境。
嗯......问题是当该方法卡住时,主线程也会卡住,直到发生硬件超时。
有没有办法避免这种情况?当然,这只是一个原子方法,所以我不能在其中添加一个循环或其他东西,以便在主线程中允许消息处理。
我怀疑这是不可能的,但我想知道是否有一些C#指令或Windows API来启动并行任务,如果该子进程被卡住,该任务不会影响主线程。
方面 海梅
答案 0 :(得分:-2)
如果你只是希望方法完成而不关心结果发生什么 - 或者 - 你可以在另一个线程中处理它;不要使用Tasks
,因为它们比thread pool
重,并且需要.Net 4.5
。
它可能比TPL
有点旧,不那么花哨,但它符合要求。您使用ThreadPool的方式与使用Task
的方式非常相似。而不是致电Run
,而是致电QueueUserWorkItem:
ThreadPool.QueueUserWorkItem(_ => {
MethodThatReadSomeDataFromExternalHardwareAsync();
});
通过这种方式,您可以享受较轻的重量ThreadPool
,并且您的代码更便携。