1

ネイティブウィンドウのProgressDialogをc#アプリケーションに追加したいと思います。より適切に制御するために、OnUserCancledイベントを定義しました。メインフォームから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フォームにあるInvoke()メソッドなど)。

注:タイマークラスにも同じ問題があります...

4

2 に答える 2

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 に答える
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 に答える