2010-12-15 13 views
2

使用C# 4.0特性我想要封裝函數的通用包裝並向它們添加TimeOut參數。在C#4.0中將'TimeOut'參數添加到'Func <>'

例如,我們有一個像功能:使用

T DoLengthyOperation() 

Func我們:

Func<T> 

這是一件好事,並調用函數甚至SyncInvloke)或AsyncBeginInvoke)。 現在想想TimeOut被添加到這個行爲,如果DoLengthyOperation()在指定的時間內返回,我們有true返回,否則false

喜歡的東西:

FuncTimeOut<in T1, in T2, ..., out TResult, int timeOut, bool result> 
+0

你問的是如何實現它或簽名應該是什麼? – SLaks 2010-12-15 18:15:49

+0

[Implement C#Generic Timeout](http://stackoverflow.com/questions/299198/implement-c-generic-timeout) – Xaqron 2010-12-19 11:07:35

回答

0

不要完全返回真/假。拋出一個異常。

我沒有時間去實現它,但它應該是可能的,你的基本特徵是這樣的:

T DoLengthyOperation<T>(int TimeoutInMilliseconds, Func<T> operation) 

而且你既可以通過傳遞任何函數功能的名稱調用此方法< T>作爲參數或將其定義爲lambda表達式。不幸的是,您還需要爲所需的不同類型的函數提供重載,因爲目前沒有辦法將泛型類型參數指定爲變量數。

0

而不是混合outbool我會改爲構建一個單獨的類型來捕獲返回。例如

struct Result<T> { 
    private bool _isSuccess; 
    private T _value; 
    public bool IsSucces { get { return _success; } } 
    public T Value { get { return _value; } } 
    public Result(T value) { 
    _value = value; 
    _isSuccess = true; 
    } 
} 

這絕對是可以寫的。唯一的問題是,爲了實現超時,需要執行以下操作之一:

  1. 將長時間運行的操作移到另一個線程上。
  2. 爲長時間運行的操作和從另一個線程發出的信號取消添加取消支持。
  3. 將超時的概念納入操作本身,並讓它檢查操作中許多點的時間過期。

哪個最適合你很難確定,因爲我們對你的方案不夠了解。我的直覺雖然會去#2或#3。讓主代碼不必切換線程可能是對代碼影響最小的改變。

+0

我更喜歡#1,因爲它對封裝函數的影響較小(不需要更改) 。我不確定這是不是一個好主意:異步調用函數,爲TimeOut調用'sleep'。起牀後檢查操作是否完成。 – Xaqron 2010-12-15 18:46:47

+0

@Xaqron,只有當函數可以安全地在另一個線程上運行時,它纔會產生影響。根據我的經驗,非常少見的功能並非針對線程安全而設計的。 – JaredPar 2010-12-15 18:48:30

相關問題