1

我想将本机 Windows ProgressDialog添加到我的 c# 应用程序。为了更好地控制,我定义了一个OnUserCancelled事件。从主窗体调用ShowDialog()后, ProgressDialog类启动一个线程,检查原生ProgressDialog是否取消。但问题是IProgressDialog属于主线程,无法从检查线程访问。错误很严重:

无法将类型为“WindowsDialogs.Invokes.Interfaces.IProgressDialogC”的 COM 对象转换为接口类型“WindowsDialogs.Invokes.Interfaces.IProgressDialog”。此操作失败,因为 IID 为“{EBBC7C04-315E-11D2-B62F-006097DF5BD4}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE)) .

我想知道是否有任何方法可以将我的命令调用到主类(例如.net Form 中的Invoke()方法)。

注意:Timer 类也有同样的问题...

4

2 回答 2

0

您应该对该 UI 主题中的进度对话框进行所有调用。在 WPF 中,我这样做:

Dispatcher.Invoke((Action)delegate()
{
    _progressDialog.SetProgress(percentComplete, 100);
});

对于 WinForms,我想这将是 Control.Invoke:http: //msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

于 2012-12-05T12:15:14.287 回答
0

正如@karlas 所指出的,这是跨线程调用的问题。

这是我使用内部计时器定期监视取消按钮状态的解决方案:

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;
    ...
}
于 2016-06-12T14:06:19.837 回答