最佳实践:何时发送回UI线程

时间:2008-11-30 15:54:41

标签: c# wpf

我对最佳协议有疑问。何时是使用如下两个辅助加载方法将调用重新发送到UI的最佳时间? Button1在返回时使用Dispatcher,Button2允许帮助程序加载类将调用封装在Dispatcher上。我倾向于喜欢Button2。

private void Button1_Click(object sender, RoutedEventArgs e)
{
    AsyncLoader.LoadAsyncWithoutDispatcher(delegate(string result)
    {
        this.Dispatcher.Invoke((Action)delegate { this.TextBox1.Text = result; });
    });
}

private void Button2_Click(object sender, RoutedEventArgs e)
{
    AsyncLoader.LoadAsyncWithDispatcher(this.Dispatcher, delegate(string result)
    {
        this.TextBox1.Text = result;
    });
}

class AsyncLoader
{
    public static void LoadAsyncWithoutDispatcher(Action<string> completed)
    {
        var worker = new AsyncClass();
        worker.BeginDoWork(delegate(IAsyncResult result)
        {
            string returnValue = worker.EndDoWork(result);
            completed(returnValue);
        }, null);
    }

    public static void LoadAsyncWithDispatcher(Dispatcher dispatcher, Action<string> completed)
    {
        var worker = new AsyncClass();
        worker.BeginDoWork(delegate(IAsyncResult result)
        {
            string returnValue = worker.EndDoWork(result);
            dispatcher.Invoke(completed, returnValue);
        }, null);
    }
}

1 个答案:

答案 0 :(得分:0)

如果代码是通用的并且对WPF基础结构并不紧密,那么第一种方法肯定更通用,因为它完全忽略了调度程序对象的使用。如果您的类与WPF紧密集成,则第二种方法是更好的做法,因为您必须使用Dispatcher调用该方法。在第一种方法中,根本不可能指定调度程序。这在WPF中肯定不是推荐的东西。