Лучшая практика: когда отправлять обратно в поток пользовательского интерфейса - PullRequest
0 голосов
/ 30 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...