我想将一个本机windows ProgressDialog添加到我的c#应用程序中。为了更好地控制,我定义了一个OnUserCancled事件。在ShowDialog()从主窗体调用之后,ProgressDialog类启动一个线程,该线程检查是否取消了本机ProgressDialog或是否取消了not.But,问题是IProgressDialog属于主线程,无法从检查器thread.The访问该线程,错误严重:
无法将'WindowsDialogs.Invokes.Interfaces.IProgressDialogC‘类型的COM对象转换为接口类型'WindowsDialogs.Invokes.Interfaces.IProgressDialog'.的
此操作失败,因为对IID‘{EBBC7C04-315 E-11D2-B62F-006097DF5BD4}’接口的COM组件的QueryInterface调用失败:不支持此类接口( HRESULT: 0x80004002 (E_NOINTERFACE)例外)。
我想知道是否有任何方法将我的命令调用到主类(比如 Invoke ( ) 方法,即.net形式)。
注意:计时器类有同样的问题.
发布于 2012-12-05 12:15:14
您应该在那个UI头上执行对进度对话框的所有调用。在WPF中,我会:
Dispatcher.Invoke((Action)delegate()
{
_progressDialog.SetProgress(percentComplete, 100);
});对于WinForms,我想那应该是Control.Invoke:http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx
发布于 2016-06-12 14:06:19
正如@karlas所指出的,这是一个跨线程调用的问题。
下面是使用内部计时器定期监视cancel按钮状态的解决方案:
private void _timerCallback(object state)
{
_parentForm.Invoke((Action) delegate {
try
{
if (HasUserCancelled)
{
Cancelled?.Invoke(this, EventArgs.Empty);
}
}
catch (Exception)
{
// Swallow
}
});
}在_parentForm方法中设置Show()字段,如下所示:
public void Show(IWin32Window parent){
if (_parentForm == null)
_parentForm = Form.ActiveForm;
...
}https://stackoverflow.com/questions/10893113
复制相似问题