在不参考函数名称的情况下递归到函数中

时间:2012-07-04 10:38:05

标签: c# multithreading invoke

我有许多从后台线程调用的函数,但是需要执行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; 

思想?

2 个答案:

答案 0 :(得分:2)

如何将调度代码拉入单独的方法?

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

Dispatch(() => FunctionABC(test));

答案 1 :(得分:2)

您可以采用这种可重复使用的方法:

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

并像这样调用它:

this.ExecuteOnDispatcherThread(() => FunctionABC(test));