非阻塞线程

时间:2013-08-29 23:34:58

标签: c# multithreading

我正在重新分解几个完整大小的应用程序使用的C#项目。此类与硬件交互,执行某些命令通常需要数百毫秒或更长时间。在许多情况下,我正在替换先前程序员用ThreadPool调用编写的Thread.Wait()调用来执行这些操作。

现在,这个项目为使用它的几个项目提供的一些函数需要几百毫秒或更长时间才能执行并且将值返回给程序必须使用的调用程序。我的问题是,我是否可以在这个项目中使用某种机制来使这些调用在主线程以外的某些线程上执行并返回?换句话说,我想从这个项目的角度来看这些方法是非阻塞的,而不是要求使用这些函数的其他应用程序将调用放在一个单独的线程中。

由于

4 个答案:

答案 0 :(得分:4)

  

换句话说,我想从这个项目的角度来看这些方法是非阻塞的,而不是要求使用这些函数的其他应用程序将调用放在一个单独的线程中。

通常,最好的方法通常是在此类场景中返回Task<T>。这允许调用者在必要时阻止,或使用新的awaitasync关键字与您的库清晰地协调,而不会阻止或强制他们移动到单独的线程。

答案 1 :(得分:1)

如果您使用的是.net 4.5,则可以使用Task.Run在单独的线程上执行慢速操作,然后ConfigureAwait(false)在主线程返回后不执行。

Task.Run(() => <slow operatoion).ConfigureAwait(false);

答案 2 :(得分:0)

不知道您正在使用的框架版本,请查看开始/结束异步模式。您应该考虑更改项目的API以实现它。

http://msdn.microsoft.com/en-us/library/ms228963.aspx

答案 3 :(得分:0)

我在类似的东西上工作......我建议你使用'select'而不是使用线程....看看这个...如果它可以帮助你

http://www.kegel.com/c10k.html