簡體   English   中英

使Webservice方法在C#/ Winforms中異步

[英]Making a Webservice Method Asynchronous in C#/Winforms

可以說我正在調用一些我無法控制的Web服務方法。 此方法需要花費很長時間才能運行,並且開發Web服務的任何人都認為沒有異步版本。

在C#/ winforms中為此類方法創建異步包裝的最佳方法是什么?

目前,我正在使用ThreadPool運行webservice方法,然后在webservice完成時調用一個事件。 這樣的事情。

DoWorkAsync() {
    Webservice.LongMethod()
    WorkCompleteEvent()
}

但是,這似乎並不理想。 例如,如果我嘗試從事件處理程序修改表單控件,則會收到有關不從其他線程執行此操作的警告。

有人有其他解決此問題的建議嗎?

請參閱有關如何:對Windows Forms控件進行線程安全調用的MSDN文章,以及Jon Skeet的關於如何 在Windows Forms中 進行線程化的出色指南

引用喬恩(重點是我的):

InvokeBeginInvokeEndInvokeCreateGraphicsInvokeRequired之外,不要在另一個線程上創建的控件上調用任何方法或屬性。 每個控件都有效地綁定到運行其消息泵的線程。 如果嘗試從其他線程訪問或更改UI中的任何內容(例如更改Text屬性),則可能會導致程序掛起或行為異常。 在某些情況下,您可能會擺脫它,但是只能靠運氣。 幸運的是,已經提供了Invoke,BeginInvoke和EndInvoke方法,以便您可以要求UI線程以安全的方式為您調用方法。

該解決方案是對Web服務使用內置的異步解決方案。 使用webservice.BeginLongMethod()調用並使用IAsyncResult。 但是請記住,由於它位於不同的線程上,因此必須始終使用Invoke方法來更新Windows窗體代碼。

請參閱以下文章

http://www.informit.com/articles/article.aspx?p=29395&seqNum=4

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

您可以使用異步委托來調用Web方法。 您可以查看C#中的“ 異步文件復制/移動”以了解如何完成。 考慮使用FileCopy是您的Web方法(而不是如示例所示的類方法)。

對於跨線程錯誤,您可以參考跨線程操作錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM