Почему этот асинхронный пример работает без Dispatcher или Control.BeginInvoke? - PullRequest
1 голос
/ 15 февраля 2012

Я тестировал асинхронный пример, который я написал в другом посте, я изменил его, чтобы показать некоторую информацию в текстовом поле.что случилось дальше я не ожидал.Я не знаю, почему он не выдает исключение при изменении элемента управления из другого потока.я слепой или почему я этого не вижу?

вот пример, он работает одинаково для silverlight и WinForms:

    int rand=0;
    public MainPage()
    {
        InitializeComponent();
    }

    public Func<Action<int, int>, Action<int>> DownloadDataInBackground = (callback) =>
    {
        return (c) =>
        {
            WebClient client = new WebClient();
            Uri uri = new Uri(string.Format("https://www.google.com/search?q={0}", c));
            client.DownloadStringCompleted += (s, e2) =>
            {
                callback(c, e2.Result.Length);
            };
            client.DownloadStringAsync(uri);
        };
    };

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        int callid = rand++;
        Debug.WriteLine("Executing CallID #{0}", callid);
        DownloadDataInBackground((c3, r3) =>this.textBox1.Text+=string.Format("The result for the callid {0} is {1} \n", c3, r3))(callid);
    }

Нажмите кнопку довольно быстро, она не потерпит неудачу.

ваша помощь будет оченьпризнателен.

Редактировать: добавлен рисунок, показывающий, что формы Windows всегда выполняют изменение элементов управления из основного потока, но почему, если он должен быть другим?winfors mainthread

1 Ответ

1 голос
/ 15 февраля 2012

Фактическим ответом на то, почему ваш код не дает сбой так, как вы ожидаете, является то, что WebClient вызывает свои события в потоке пользовательского интерфейса.Следовательно, вы не изменяете свой контроль в другом потоке, как вы, кажется, представляете.

...