0

バックグラウンドスレッドから呼び出される関数が多数ありますが、GUI操作を実行する必要があります。したがって、各関数で、コンテキストをGUIスレッドに切り替えます。しかし、私のコードを改善できるかどうか疑問に思っていますか?

これが私のコードが現在どのように見えるかの縮小例です:

public void FunctionABC(string test)
{
  // Make sure we are in the GUI thread.
  if (!this.Dispatcher.CheckAccess()) 
  {
    this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => FunctionABC(test))); return; 
  }
  // main body of function
}

私が問題を抱えている主な部分は、コンテキストスイッチで自分の関数名を明示的に言及する必要があることです(コードをコピーして貼り付けるときに名前を変更するのを忘れ続けるので、これは部分的に嫌いです!)

コンテキストを切り替えるより一般的な方法のアイデアはありますか?たとえば、関数に明示的に名前を付けることを回避する巧妙なポインターを介して自分の関数を呼び出す方法はありますか?

このスニペットのようなものが良いでしょう(ただし、ビルドされません):

    this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => this(test))); return; 

考え?

4

2 に答える 2

2

ディスパッチコードを別のメソッドにプルするのはどうですか?

public void Dispatch(Action action)
{
    if (!this.Dispatcher.CheckAccess()) 
    {
        this.Dispatcher.Invoke(DispatcherPriority.Normal, action);
    }
    else
    {
        action();
    }
}

と:

Dispatch(() => FunctionABC(test));
于 2012-07-04T10:45:42.047 に答える
2

この再利用可能な方法を取ることができます:

private void ExecuteOnDispatcherThread(Action action)
{
    if (!this.Dispatcher.CheckAccess()) {
        this.Dispatcher.Invoke(DispatcherPriority.Normal, action); 
    }
    else {
        action();
    }
}

そして、次のように呼び出します。

this.ExecuteOnDispatcherThread(() => FunctionABC(test));
于 2012-07-04T10:45:47.090 に答える