2012-07-04 31 views
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 
} 

我有是有在上下文切换明确提到我自己的函数名称的问题的主要部分(I部分不喜欢这因为当我复制并粘贴代码时,我一直忘记更改名称!)

任何有关切换上下文的更一般方式的想法,例如有什么方法可以通过一些避免明确指定函数的聪明指针回调我自己的函数?

事情是这样的片断将是一件好事(不但是建):

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

的思考?

回答

2

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

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

和:

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

+1和lulz的时机: ) – Jon

+0

@Jon:相隔5秒,相同的答案。 :) – casablanca

+0

@casablanca:看起来不错,我会给它一个 - 给你+1和乔恩! – Surfbutler

2

你可以把可重复使用的方法:

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

并调用它像这样:

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

+1对你也是! :) – casablanca