#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 теперь все работает нормально. Это решило мою проблему, спасибо за вашу быструю помощь.