【问题标题】:Change textbox Text during async Task-Update UI [duplicate]在异步任务更新 UI 期间更改文本框文本 [重复]
【发布时间】:2017-06-10 01:01:04
【问题描述】:

这是我的简单代码:

   private async void button1_Click(object sender, EventArgs e)
    {
      TextBox1.Text = "";
      await MyMethodAsync();
    }

    public async Task MyMethodAsync()
    {
      TextBox1.Text = "Test 1" + Environment.NewLine;  

      HttpWebRequest req = (HttpWebRequest)WebRequest.Create(main_url + "Appointment/LoadVisaAppointmentTypeDetail?id=");
      req.Method = "GET";
      req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8";
      req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36";
      req.ContentType = "text/html; charset=utf-8";
      req.KeepAlive = true;
      req.Timeout = 25000;
      req.AllowAutoRedirect = true;
      res = (HttpWebResponse)req.GetResponse();
      Stream Stream = res.GetResponseStream();
      StreamReader reader = new StreamReader(Stream);
      string reader_str = reader.ReadToEnd();
      ...
      TextBox1.Text += "Test 2" + Environment.NewLine;
      ...
      TextBox1.Text += "Done";
    }

在运行这些代码期间,我无法移动 TextBox1 的滚动条,并且我可以在 Done 行之后看到日志。
async Task MyMethodAsync() 工作期间如何解除对 TextBox1 的阻止?

【问题讨论】:

  • 您是否尝试过放置一个简单的“DoEvents”来强制 UI 更新?
  • ... 部分向我们展示更完整的代码。
  • MyMethodAsync的内容移动到事件处理程序中,以便// "lot of IO and stuff"在没有阻塞UI线程的情况下等待,TextBox1.Text的更新发生在UI线程上
  • 如果您不在 UI 线程上,它会抛出异常,您必须将其编组回 ui
  • 您发布的代码中没有任何内容会导致您的长时间运行的操作异步运行。假设您没有关闭警告,您甚至会收到来自编译器的消息。注意编译器告诉你的内容;这一点很重要。如果您认为您正在异步运行代码,则需要发布一个很好的 minimal reproducible example 来实际证明这一点。

标签: c# winforms asynchronous task .net-4.6.2


【解决方案1】:

你可以试试这样的:

private async void button1_Click(object sender, EventArgs e)
{
    string reader_str = "";

    textBox1.Text = "Test 1" + Environment.NewLine;          
    await Task.Run(() =>
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(main_url + "Appointment/LoadVisaAppointmentTypeDetail?id=");
        req.Method = "GET";
        req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8";
        req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36";
        req.ContentType = "text/html; charset=utf-8";
        req.KeepAlive = true;
        req.Timeout = 25000;
        req.AllowAutoRedirect = true;
        res = (HttpWebResponse)req.GetResponse();
        Stream Stream = res.GetResponseStream();
        StreamReader reader = new StreamReader(Stream);
        reader_str = reader.ReadToEnd();
    });
    textBox1.AppendText(reader_str + Environment.NewLine + Environment.NewLine);

    textBox1.AppendText("Test 2" + Environment.NewLine);
    await Task.Run(() =>
    {
        // ...
    });
    textBox1.AppendText(reader_str + Environment.NewLine + Environment.NewLine);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多