2013-08-29 215 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);