我在使用.NET編寫投擲警告,看起來像我的COM組件的麻煩:從WinForms GUI線程調用COM線程方法的問題?
上下文0x15eec0斷開。沒有 代理將用於服務COM組件上的 請求。這可能會導致數據損壞或數據丟失 。爲了 避免此問題,請確保 所有上下文/公寓活路 直到應用程序完全 與代表 住在他們裏面COM組件RuntimeCallableWrappers 完成。
看起來這是由我的GUI線程調用COM線程中的函數而沒有必要的同步引起的。作爲參考,我使用在http://msdn.microsoft.com/en-us/library/ms229609%28VS.80%29.aspx中設置的準則來在COM組件中創建我的GUI線程。
我的代碼看起來是這樣的:
class COMClass {
// this is called before SomeMethod
public void Init() {
ComObject comObject = new ComObject(); // this is imported from a TLB
// I create my GUI thread and start it as in the MSDN sample
Thread newThread = new Thread(new ThreadStart(delegate() {
Application.Run(new GUIForm(comObject));
}));
}
public void SomeMethod(){
comObject.DoSomething(); // this is where the error occurs
}
}
class GUIForm : Form {
ComObject com;
public GUIForm(ComObject com) {comObject = com;}
public void SomeButtonHandler(object sender, EventArgs e) {
comObject.SomeMethod(); // call on the GUI thread but the com object is bound to the COM thread...
}
}
是否有處理這個既定的方法?調用GUI是沒有問題的(Invoke/BeginInvoke),但調用其他方式似乎更困難...
編輯:它也不是一個選項修改COM對象的任何方式。
這是不適用於此應用程序的COM系統的設計。沒有暴露的循環,我可以插入代碼來使用隊列中的事件;如果我將一個循環添加到在我的COM對象上調用的任何函數,它將永遠不會返回到調用應用程序。 – 2010-02-18 23:18:34
坦率地說,我希望有某種ThreadBoundInvoker,我可以發佈事件來執行綁定的線程。 – 2010-02-18 23:20:03
是否僅由GUIForm使用COM對象?如果是這樣,你可以在窗體中實例化它,並且所有的東西都在GUI線程中。 – PatrickSteele 2010-02-19 01:27:44