C#COMException:无法从事件

时间:2018-07-19 15:45:59

标签: c# wpf com .net-3.5 comexception

我有一个winform(MyFrm),其中包含一个winforms用户控件(myWinformUserControl)。我从此用户控件中调用一个公共方法(MyMethod):

using (var frm = new MyFrm())
{
      frm.myWinformUserControl.MyMethod();
}

public class myWinformUserControl: System.Windows.Forms.UserControl
{
     public void MyMethod()
     { 
          // Do some stuff
          TryToDisconnect();
     }

     private void TryToDisconnect()
     {
         myComObj.Disconnect(); // This throws COMException
     }
}

此用户控件与COM对象通信。当我调用COM对象上的断开连接时,会引发异常:

COMException: Cannot call a 'Disconnect()' from within an event

所以为了解决这个问题,我使用了一个线程而不是直接调用它:

 public void MyMethod()
 { 
     System.Threading.Thread th = new System.Threading.Thread(new 
     System.Threading.ThreadStart(TryToDisconnect));
     th.SetApartmentState(System.Threading.ApartmentState.STA);
     th.IsBackground = true;
     th.Priority = System.Threading.ThreadPriority.Highest;
     th.Start();
 }

此问题开头指示的以下代码块:

using (var frm = new MyFrm())
{
      frm.myWinformUserControl.MyMethod();
}
从WPF MVVM视图模型类中调用

...。

这里的问题是我需要立即完成MyMethod,因此我为线程设置了最高优先级,并且我希望视图模型类(frm.myWinformUserControl.MyMethod())中的调用停止并且不继续直到该线程完成。我观察到线程没有立即执行,那么如何实现呢?

我尝试了异步调用,然后等待它完成而不是使用线程:

public void MyMethod()
{ 
   Action action = Foo;
   IAsyncResult result = action.BeginInvoke(ar => action.EndInvoke(ar), null);                    
   result.AsyncWaitHandle.WaitOne();
}

public delegate void Action();
private void Foo()
{
    TryToDisconnect();
}

但再次抛出相同的COMException:

COMException: Cannot call a 'Disconnect()' from within an event

另外,在使用线程的情况下,如果我在执行th.start()之后立即执行th.Join(),则它不起作用。

0 个答案:

没有答案