У меня вопрос по лучшим методикам. Когда лучше всего отправить обратный вызов пользовательскому интерфейсу при использовании вспомогательного метода загрузки, подобного двум приведенным ниже? 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);
}
}





Если код является универсальным и не очень тесно связан с инфраструктурой WPF, первый метод определенно более общий, поскольку он полностью игнорирует использование объекта диспетчера. Если ваш класс тесно интегрирован с WPF, второй метод - лучшая практика, поскольку вам нужно вызывать метод с помощью Dispatcher. В первом способе можно вообще не указывать диспетчера. Это, конечно, не рекомендуется в WPF.