我有一个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(),则它不起作用。