2012-04-17 157 views
0

我有一個控制檯應用程序,它執行類方法(在不同的項目中)。 該方法異步執行POST到web服務(這是一個3分鐘的漫長操作),並具有返回受POST影響的記錄數的回調。與此同時,程序繼續執行其他需要不到3分鐘的時間,程序在回調返回前退出。控制檯應用程序在執行回調之前退出

在過去,我使用了下面描述的ManualResetEvent來防止完成,但在這種情況下,我的方法位於不同的類庫中,我希望儘可能保持乾淨。


static ManualResetEvent resetEvent = new ManualResetEvent(false) 

static void Main() 
{ 
    CallAsyncMethod(); 
    // Do other things... 
    resetEvent.WaitOne(); // Blocks until "set" 
} 

void AsyncMethodCallback() 
{ 
    // Do processing on completion... 
    resetEvent.Set(); // Allow the program to exit 
} 

我會感謝任何幫助提出一個乾淨的模式來實現這一點,而不會污染被調用的類與執行標誌。

回答

4

如果可以(特別是,如果您使用的是.NET 4),請讓您的CallAsyncMethod返回TaskTask<T>。然後你可以很容易地附加延續,等待它完成等。如果只有回調的目的是獲得記錄的數量,返回一個Task<int>將是理想的。您可以在異步方法中使用TaskCompletionSource<TResult>所以填充的結果真的很容易,所以你不需要回調在所有主類中,這將有一個主要的方法是這樣的:

static void Main() 
{ 
    Task<int> asyncTask = CallAsyncMethod(); 
    // Do other things... 
    int count = asyncTask.Result; 
    // Do anything you need with the count 
} 

新的異步功能在C#5中可以很好地與Task<T>配合使用,所以當它到達時你將準備好迎接新版本。

+0

@Jon Skeet:確保[ContinueWith](http://msdn.microsoft.com/zh-cn/library/dd270696.aspx)被執行?我的意思是,如果調用線程將會死亡(在這種情況下是主線程),它是否會等待,因爲還有一個「Task <>」必須在完成時執行一個東西? – Tigran 2012-04-17 20:08:19

+0

@Tigran:在什麼意義上?應用程序關閉之前?如果沒有任何前臺線程IIRC,則不需要。但在這裏你不需要ContinueWith - 只需等待任務完成即可。 – 2012-04-17 20:10:32

+0

@Tigran:現在你已經編輯了評論:)不,如果Main方法返回並且沒有其他前景線程,我不希望繼續觸發。但是阻止主要方法返回很容易 - 請參閱我的編輯。 – 2012-04-17 20:11:32

1

在另一個前臺線程上啓動webservice請求。在所有前景線程完成執行之前,應用程序不會退出。

new Thread(() => CallSynchronousMethod()).Start(); 
+0

好想法。沒有想到前臺線程塊。 – Diego 2012-04-17 20:19:41

相關問題