当web方法正在运行时,无法与表单交互
本文关键字:表单 交互 运行时 web 方法 | 更新日期: 2023-09-27 18:13:04
我制作了一个c# Windows窗体。它使用了一个web方法,然后我想把webmethod的结果写到一个列表框。web方法在循环中运行,直到我按下停止按钮。
我遇到的问题是,我无法单击表单上的任何控件,甚至在表单本身周围移动也是不可能的。
将webmethods结果添加到列表框的功能正在工作。但是这几乎是无用的,因为我不能向下滚动添加的项目列表。
我在每个web方法调用之间放置了1秒的睡眠时间,但这没有帮助…
bool stop = false;
private void button1_Click(object sender, EventArgs e)
{
stop = false;
while (stop == false) {
GetTime(textBox1.Text);
System.Threading.Thread.Sleep(1000);
}
}
private void GetTime(string mid)
{
string i;
com.Service test = new com.Service();
i = test.GetZonedDateTimeByMID(mid).ToString();
lstLog.Items.Add(i);
}
private void btnStop_Click(object sender, EventArgs e)
{
stop = true;
}
调用静态方法Thread.Sleep(X)
将导致当前线程(在您的示例中是应用程序的UI线程)进入睡眠状态。是的,这会使应用程序无响应。你需要在后台工作线程中完成你的工作,要么使用Task
,要么调用ThreadPool.QueueUserWorkItem
。
但是,请注意,您不能直接从应用程序的UI线程以外的任何线程更新UI元素,您需要调用控件的Invoke
方法。
你应该使用线程安全调用Windows窗体控件来更新列表框内容。否则将抛出异常,因为默认情况下不允许从另一个线程更改表单的属性。