C# 最佳实践:何时分派回UI线程

C# 最佳实践:何时分派回UI线程,c#,wpf,C#,Wpf,我有一个关于最好的条约的问题。当使用下面两种帮助器加载方法时,何时是向UI发送回拨的最佳时间?Button1在返回时使用Dispatcher,Button2允许助手加载类封装对Dispatcher的调用。我倾向于按钮扣 private void Button1_Click(object sender, RoutedEventArgs e) { AsyncLoader.LoadAsyncWithoutDispatcher(delegate(string result) {

我有一个关于最好的条约的问题。当使用下面两种帮助器加载方法时,何时是向UI发送回拨的最佳时间?Button1在返回时使用Dispatcher,Button2允许助手加载类封装对Dispatcher的调用。我倾向于按钮扣

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);
    }
}
private void按钮1\u单击(对象发送者,路由目标)
{
AsyncLoader.LoadAsyncWithoutDispatcher(委托(字符串结果)
{
调用((操作)委托{this.TextBox1.Text=result;});
});
}
私有无效按钮2\u单击(对象发送者,路由目标)
{
AsyncLoader.LoadAsyncWithDispatcher(this.Dispatcher,委托(字符串结果)
{
this.TextBox1.Text=结果;
});
}
类异步加载器
{
公共静态void LoadAsyncWithoutDispatcher(操作已完成)
{
var worker=new AsyncClass();
worker.BeginDoWork(委托(IAsyncResult结果)
{
字符串returnValue=worker.EndDoWork(结果);
已完成(返回值);
},空);
}
公共静态void LoadAsyncWithDispatcher(Dispatcher Dispatcher,操作已完成)
{
var worker=new AsyncClass();
worker.BeginDoWork(委托(IAsyncResult结果)
{
字符串returnValue=worker.EndDoWork(结果);
dispatcher.Invoke(已完成,返回值);
},空);
}
}

如果代码是通用的,并且与WPF基础设施的关系不是很紧密,那么第一种方法肯定更通用,因为它完全忽略了dispatcher对象的使用。如果您的类与WPF紧密集成,那么第二种方法是更好的做法,因为您必须使用调度器调用该方法。在第一种方法中,可以根本不指定dispatcher。在WPF中,这当然不是推荐的做法