2013-08-29 221 views
1

我重新构造了几个全尺寸应用程序使用的C#项目。该类与硬件交互,并且通常需要几百毫秒或更长时间来执行某些命令。在许多情况下,我正在使用ThreadPool调用来编写Thread.Wait()调用来执行这些操作。现在非阻塞线程

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

感谢

+1

这是一个非常模糊的问题,但你可能想看看['BackgroundWorker'(http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx) –

+0

您是否允许更改外部接口,还是必须在不修改“全尺寸应用”的情况下工作?不知道你是否可以在不改变界面的情况下实现你想要的。如果可以,还有异步/等待模式(.net 4.5)或任何一种基于异步事件的模式(.net <= 4.0) – havardhu

回答

4

换句话说,我想打从这个项目的角度来看,这些方法无阻塞,而不需要使用这些功能放置在一个单独的线程调用其他应用程序。

一般来说,最佳方法通常是在这种情况下返回Task<T>。这样,主叫方可以根据需要进行阻止,或者使用新的关键字与您的库完全协调,而不会阻止或强制它们移动到单独的线程。

0

不知道你使用的是什么版本的框架,看看开始/结束异步模式。你应该看看改变项目的API来实现它。

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

+0

APM模型实际上已过时 - 使用“任务”对于新图书馆,因为它提供的所有好处,没有缺点,以及未来证明API好得多...... –

+0

@ReedCopsey - 我意识到这是一个'成熟'的模式。该框架的v4.0中引入了任务。该项目是一个现有的项目,很可能在4.0之前。 – Plymouth223

+0

即使您必须支持.NET 3.5,EAP模式通常会将APM模式替换为.NET 4。 –

1

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

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