2011-03-16 75 views
1

我想知道如何完成此操作。我有一個COM對象,其操作有時需要很長時間,另外我注意到,如果出現錯誤,它有20分鐘的超時時間。這是客戶端程序等待這麼長時間無法接受的。通過超時調用COM Interop

因此,我在考慮在另一個線程上調用COM操作,並且在某個超時之後才殺死線程。

我有COM幫手通過反射,這是同步做invokation:

ComInvoke.Get<bool>(dcomSrv, "Launched"); 

這得到了布爾屬性從COM實例

,我想換這個使用任務:

var task = Task.Factory.StartNew<bool>(() => 
      { 
       return ComInvoke.Get<bool>(dcomSrv, "Launched"); 
      }); 

if (task.Wait(5000) == false) 
      { 
       task.Dispose(); 
       throw new Exception("Task timeout"); 
      } 

問題是,在任務中沒有循環,我可以使用取消令牌。

您認爲這是一個很好的解決方案還是您有更好的?

謝謝!

+0

它是一個進程內COM對象還是一個遠程DCOM對象(名稱「dcomSrv」是一個令人不安的線索)? – 2011-03-16 10:26:53

+0

這是一個DCOM對象(類型的代理),可以在本地執行或在遠程機器上執行 – Robert 2011-03-16 10:31:55

回答

2

Task::Dispose實際上不會停止Task的底層線程,並且因爲TPL使用線程池默認情況下安排其工作的,這個邏輯會消耗線程池線程全20分鐘的DCOM對象被阻止。事實上,如果您撥打Dispose未完成Task,我敢肯定你會得到一個例外。

這是TPL可能不應該被使用的情況,你只是想旋轉自己的Thread實例,只是如果它沒有在所需的時間內完成,它就是Abort

+0

感謝您的答案,我以這種方式進行測試,似乎表現合理。 – Robert 2011-03-17 10:56:49

相關問題