当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;
}

当web方法正在运行时,无法与表单交互

调用静态方法Thread.Sleep(X)将导致当前线程(在您的示例中是应用程序的UI线程)进入睡眠状态。是的,这会使应用程序无响应。你需要在后台工作线程中完成你的工作,要么使用Task,要么调用ThreadPool.QueueUserWorkItem

但是,请注意,您不能直接从应用程序的UI线程以外的任何线程更新UI元素,您需要调用控件的Invoke方法。

你应该使用线程安全调用Windows窗体控件来更新列表框内容。否则将抛出异常,因为默认情况下不允许从另一个线程更改表单的属性。