首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IProgressDialog在c#中的线程处理

IProgressDialog在c#中的线程处理
EN

Stack Overflow用户
提问于 2012-06-05 07:13:01
回答 2查看 591关注 0票数 1

我想将一个本机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形式)。

注意:计时器类有同样的问题.

EN

回答 2

Stack Overflow用户

发布于 2012-12-05 12:15:14

您应该在那个UI头上执行对进度对话框的所有调用。在WPF中,我会:

代码语言:javascript
复制
Dispatcher.Invoke((Action)delegate()
{
    _progressDialog.SetProgress(percentComplete, 100);
});

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

票数 0
EN

Stack Overflow用户

发布于 2016-06-12 14:06:19

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

下面是使用内部计时器定期监视cancel按钮状态的解决方案:

代码语言:javascript
复制
private void _timerCallback(object state)
{
    _parentForm.Invoke((Action) delegate {
        try
        {
            if (HasUserCancelled)
            {
                Cancelled?.Invoke(this, EventArgs.Empty);
            }
        }
        catch (Exception)
        {
            // Swallow
        }
    });
}

_parentForm方法中设置Show()字段,如下所示:

代码语言:javascript
复制
public void Show(IWin32Window parent){
    if (_parentForm == null)
        _parentForm = Form.ActiveForm;
    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10893113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档