Есть ли предпочтительный подход для введения задержки перед вызовом WCF? - PullRequest
0 голосов
/ 21 октября 2010

Поскольку мой пользователь изменяет CurrentItem в dataForm, мне нужно пойти на сервер, чтобы получить дополнительные данные.Вполне вероятно, что пользователь сможет прокрутить несколько пунктов, прежде чем найдет нужный.Я хотел бы поспать 500 мс, прежде чем собирать данные.

Есть ли уже компонент в SDK или инструментарий, например, фоновый рабочий, который поможет вернуться в поток пользовательского интерфейса для выполнения моего асинхронного вызова WCFкогда закончится сон 500 мс?Похоже, что если я этого не сделаю и попытаюсь вместо этого вызвать асинхронный метод WCF в потоке спящего, то событие Completed будет запущено в потоке спящего, а не в потоке пользовательского интерфейса, что, конечно, не хорошо.

1 Ответ

3 голосов
/ 21 октября 2010

Я думаю, что вы, возможно, немного не в своем уме. Я не уверен, почему вы чувствуете, что вам нужно вернуться к потоку пользовательского интерфейса, чтобы сделать вызов asych. Как правило, вы выполняете как можно больше работы с потоком BG и возвращаетесь к потоку пользовательского интерфейса только при наличии результатов (через Dispatcher).

Я обычно использую System.Threading.Timer для этой цели:

public class MyViewModel
{
    private readonly Timer refreshTimer;

    public MyViewModel()
    {
        this.refreshTimer = new Timer(this.DoRefresh);
    }

    public object CurrentItem
    {
        get { ... }
        set
        {
            ...
            Invalidate();
        }
    }

    // anything that should invalidate the data should wind up calling this, such as when the user selects a different item
    private void Invalidate()
    {
        // 1 second delay
        this.refreshTimer.Change(1000, Timeout.Infinite);
    }

    private void DoRefresh()
    {
        // make the async call here, with a callback of DoRefreshComplete
    }

    private void DoRefreshComplete()
    {
        // update the UI here by way of the Dispatcher
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...