Вызов GetRequestStream() зависает пользовательский интерфейс WPF на 1 секунду

#c# #wpf

#c# #wpf

Вопрос:

Я создал приложение wpf, которое управляет одной меткой и двумя кнопками для таймеров запуска и остановки.

Я создал два диспетчерских таймера, один таймер будет срабатывать через каждые 50 миллисекунд и обновлять ярлык значением count. Через каждые 2 секунды запускается другой диспетчер, который отправляет данные на тестовый сервер HTTP post с именем «http://posttestserver.com/post.php?dir=Test «. В этом таймере я использую GetRequestStream, который заставляет пользовательский интерфейс останавливаться на 1 секунду, но мои данные отправляются на posttestserver. Я использовал следующий код.

открытый частичный класс MainWindow : Window {

     static int count = 0;
    DispatcherTimer dispatchtimer = null;
    DispatcherTimer WebDispatchTimer = null;
    public MainWindow()
    {
        InitializeComponent();
        dispatchtimer = new DispatcherTimer();
        WebDispatchTimer = new DispatcherTimer();
        WebDispatchTimer.Interval = TimeSpan.FromMilliseconds(2000);
        dispatchtimer.Interval = TimeSpan.FromMilliseconds(50);
        dispatchtimer.Tick  = new EventHandler(dispatchtimer_Tick);
        WebDispatchTimer.Tick  = new EventHandler(senddata_Tick);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        WebDispatchTimer.Start();
        dispatchtimer.Start();
    }
    private void dispatchtimer_Tick(Object sender, EventArgs args)
    {
        count  = 1;
        label1.Content = count.ToString();
    }
    private void senddata_Tick(Object sender, EventArgs args)
    {
        string postdata = "This is a test that posts this string to a Web servern";
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://posttestserver.com/post.php?dir=abcd");
            request.Method = "POST";
            request.ProtocolVersion = HttpVersion.Version11;
            byte[] byteArray = Encoding.UTF8.GetBytes(postdata);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteArray.Length;
            request.Proxy = null;
            using (Stream dataStream = request.GetRequestStream())
            {
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Flush();
                dataStream.Close();
            }
            var response = request.GetResponse() as HttpWebResponse;
            response.Close();
            request.Abort();
            request = null;
        }
        catch (WebException ex)
        {
            MessageBox.Show(ex.Message);
            WebDispatchTimer.Stop();

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            WebDispatchTimer.Stop();
        }         
    }
    private void button2_Click(object sender, RoutedEventArgs e)
    {
        WebDispatchTimer.Stop();
        dispatchtimer.Stop();
    }
}
 

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

Комментарии:

1. Предполагая, что вы прочитали руководство по DispatcherTimer , вы знаете, что он выполняется в потоке пользовательского интерфейса… Так что, я думаю, ваше ожидание того, что пользовательский интерфейс не будет заморожен, — это ваша ошибка — согласно вашему коду, он должен заморозить пользовательский интерфейс при получении ответа при запуске в потоке пользовательского интерфейса (в отличие от обычного Timer ).

2. Спасибо за ваш ответ. Теперь я изменил таймер webdispatcher на системный. Таймеры. Таймер WebDispatchTimer теперь все работает нормально. Это решило мою проблему, спасибо за вашу быструю помощь.