我有一個C#DLL,當調用main方法時,它會打開一個窗體。這個DLL當前是通過供應商應用程序通過VBA訪問的。問題是當dll被調用並且表單打開時,用戶失去了與供應商應用程序交互的能力。我希望如果我可以修改dll以支持異步調用,那麼可以將控件返回到調用應用程序,以允許用戶打開頁面,放大或縮小等。然後,一旦用戶完成彈出窗口表單,我們可以回調或返回信息到vba應用程序自定義。從VB6應用程序調用C#異步方法
回答
而不是從VB進行異步調用,修改C#代碼以異步打開窗口,然後返回會更容易。
只需將打開窗口的行從.ShowDialog()
更改爲.Show()
即可。
顯然,如果您無法訪問C#dll的代碼,這可能不是一種選擇,但我認爲我會建議它。
如果你決定改變使用的Show()
代替ShowDialog()
您可能需要不同的方式處理對話框的結果。
你是新代碼將是這個樣子:
MyForm win = new MyForm();
win.Show();
非模態對話框不會阻止調用代碼,所以調用代碼將繼續而不等待結果。
處理此問題的最簡單方法是將事件處理程序附加到表單的.OnClosed event。這將在用戶關閉表單時觸發。
MyForm win = new MyForm();
win.OnClosed += new EventHandler<FormClosedEventArgs>(YourEventHandlerMethod)
win.Show();
您可以添加一個公共布爾屬性窗體(帶私人二傳手),您內部設置當按下確定/取消按鈕(除了調用close方法)。然後,您可以在封閉處理程序中的表單關閉後檢查該屬性。 (發件人屬性將是您對錶單的引用,您只需首先將其轉換爲正確的類型即可)。
所以,你的事件處理方法是這樣的:
private void EventHandler<FormClosedEventArgs> YourEventHandlerMethod(Object sender, FormClosedEventArgs e)
{
MyForm f = (MyForm)sender;
bool result = f.TheResultProperty;
// Now do your callback.
}
最後,現在你有運行窗體關閉後,並先後獲得了形式造成的,你只需要讓你的VBA一些代碼代碼知道它已經準備好了 - 我會把這個留給你。
我在前段時間看過,然後我看到的問題是,我正在使用對話框結果來了解是否用戶取消了表單或點擊了角落中的X等,我會再次查看這個。 – Brian 2010-01-20 21:51:57
這比修改你的VBA代碼來調用異步要容易得多。我會修改我的答案,以包含處理Show&ShowDialog之間差異的一些提示。 – 2010-01-20 22:02:48
@布萊恩。查看更新。 – 2010-01-20 22:25:43
- 1. C#異步方法調用
- 2. 如何從非異步方法異步調用異步方法
- 3. 從ASP.NET調用異步方法調用
- 4. 使用c#5.0調用異步方法
- 5. C#Windows通用應用程序未檢測到異步方法
- 6. 如何從非異步方法調用異步方法?
- 7. 如何從不是異步方法調用異步方法?
- 8. C#:異步回調 - 回調方法的處理是否阻止應用程序?
- 9. 在C#WPF應用程序中異步調用與控件的委託方法
- 10. 調用C#異步方法不會在Web應用程序中返回
- 11. 異步方法調用同步方法
- 12. 在C中異步調用方法#
- 13. C#異步方法調用一路主
- 14. 等待異步方法在c#調用
- 15. 從另一個應用程序調用套接字方法?異步套接字
- 16. 從另一個C#應用程序調用C#應用程序的方法
- 17. 異步調用異步方法
- 18. 異步方法調用的排序
- 19. 異步方法調用 - 維護序列
- 20. 如何在不使用C#的異步方法中調用異步方法.Result
- 21. 從Session_Start調用異步方法
- 22. 從ViewModel調用異步方法
- 23. 從webservice調用異步方法
- 24. 從wcf服務調用異步方法
- 25. 調用從非異步方法
- 26. Webservice - 線程與異步方法調用
- 27. 異步調用webservice方法
- 28. WCF調用異步方法
- 29. 異步方法調用
- 30. 調用方法aspx異步
這應該有所幫助:http://www.codeproject.com/KB/vbscript/AsyncSample.aspx – 2010-01-20 21:41:13