我制作了一个C#Windows窗体。它使用Web方法,然后我想将webmethod结果写入列表框。 web方法循环运行,直到我按下停止按钮。
我遇到的问题是,我无法点击表单上的任何控件,甚至无法移动表单本身。
将webmethods结果添加到列表框的功能正在运行。但它几乎没用,因为我无法向下滚动添加项目列表。
我在每个网络方法调用之间放置了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;
}
答案 0 :(得分:1)
您应该使用Threads并使用Thread-Safe Calls to Windows Forms Controls更新列表框内容。否则将抛出异常,因为默认情况下不允许从另一个线程更改表单的属性。
答案 1 :(得分:1)
调用静态方法Thread.Sleep(X)
将导致当前线程(在您的情况下,您的应用程序的UI线程)进入休眠状态。所以,是的,这将使您的应用程序无响应。您需要使用Task
或致电ThreadPool.QueueUserWorkItem
从后台工作线程开展工作。
但是,请注意,您无法直接从应用程序的UI线程以外的任何线程更新UI元素,您需要调用控件的Invoke
方法。