c# 调用异步网络请求,返回结果后无法更新UI

JPF1024 2018-06-18 05:17:58
思路是这样的:

界面类实现一个接口,接口中定义了统一方法,用作异步网络请求完成后的回调方法.

然后,

界面点击按钮,调用网络请求,网络请求开始处理,处理完成后,调用回调方法.

问题出现在:在回调方法中,可以用MessageBox输出返回的值,但就是没法设置到文本框,试过好几个方法都还是不行,谢谢大神帮忙看一下.


窗口:

using System;
using System.Windows.Forms;

namespace ASyncUpdateUI
{
public partial class Form1 : Form, FormInterface
{
public Form1()
{
InitializeComponent();
}

void FormInterface.SendResult(string text)
{
// 调用返回的数据.
// 在这里更新UI,更新不到.
// 但是可以弹出.
MessageBox.Show(text);


// !!!!!!
// 下面这一句设置失败
// TODO
this.targetText.Text = text;
}

private void send_Click(object sender, EventArgs e)
{
SendHTTP send = new SendHTTP();
send.SendGet("http://www.baidu.com", new Form1());

}
}
}



回调接口(实现类(指窗口类)中实现具体的回调方法):

namespace ASyncUpdateUI
{
interface FormInterface
{

void SendResult(string text);

}
}



网络请求模拟(此处并没有真正请求网络.只是模拟了一下场景)

using System;
namespace ASyncUpdateUI
{
class SendHTTP
{

public void SendGet(string url,FormInterface formInterface)
{
// 模拟异步网络请求.
// .......................


// 返回网络请求结果.
//
string result = "ok";
formInterface.SendResult(result);
}
}
}




想要实现的效果是,将返回的结果值,设置到文本框中.


void FormInterface.SendResult(string text)
{
// 调用返回的数据.
// 在这里更新UI,更新不到.
// 但是可以弹出.
MessageBox.Show(text);


// !!!!!!
// 下面这一句设置失败
// 从这怎么才能成功设置值到文本框中?
this.targetText.Text = text;
}




界面效果:



谢谢.
...全文
1170 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
JPF1024 2018-06-19
  • 打赏
  • 举报
回复
引用 11 楼 loyal_to 的回复:
帮你试了将new form1()改为this是可以的
按照这位兄弟说的方法解决了。 果然可以,万分感谢,谢谢!
JPF1024 2018-06-19
  • 打赏
  • 举报
回复
引用 12 楼 loyal_to 的回复:
而且我看了你代码,你根本就还没有开异步,所以加不加begininvoke都是不影响的
异步网络的了,只是这个示例的没写上。
loyal_to 2018-06-19
  • 打赏
  • 举报
回复
而且我看了你代码,你根本就还没有开异步,所以加不加begininvoke都是不影响的
loyal_to 2018-06-19
  • 打赏
  • 举报
回复

帮你试了将new form1()改为this是可以的
  • 打赏
  • 举报
回复
JPF1024 2018-06-19
  • 打赏
  • 举报
回复
引用 4 楼 daixf_csdn 的回复:
if (this.IsHandleCreated) { this.BeginInvoke(new Action(() => { this.targetText.Text = text; })); }
昨天试了这个办法,不能用。。。。。。
圣殿骑士18 2018-06-19
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
send.SendGet("http://www.baidu.com", new Form1()); 应为 send.SendGet("http://www.baidu.com", this);
我去,没发现这个梗。
exception92 2018-06-19
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
send.SendGet("http://www.baidu.com", new Form1()); 应为 send.SendGet("http://www.baidu.com", this);
xuzuning 2018-06-19
  • 打赏
  • 举报
回复
send.SendGet("http://www.baidu.com", new Form1()); 应为 send.SendGet("http://www.baidu.com", this);
圣殿骑士18 2018-06-19
  • 打赏
  • 举报
回复
if (this.IsHandleCreated) { this.BeginInvoke(new Action(() => { this.targetText.Text = text; })); }
JPF1024 2018-06-18
  • 打赏
  • 举报
回复
引用 2 楼 daixf_csdn 的回复:
this.BeginInvoke(new Action(()=> { this.targetText.Text = text; }));

void FormInterface.SendResult(string text)
        {
            // 调用返回的数据.
            // 在这里更新UI,更新不到.
            // 但是可以弹出.
            MessageBox.Show(text);


            // !!!!!!
            // 下面这一句设置失败
            // 
            // this.targetText.Text = text;

            this.BeginInvoke(new Action(() =>
            {
                this.targetText.Text = text;
            }));
        }

上面这样写,报错,怎么处理啊,谢谢: System.InvalidOperationException:“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”
圣殿骑士18 2018-06-18
  • 打赏
  • 举报
回复
this.BeginInvoke(new Action(()=> { this.targetText.Text = text; }));
JPF1024 2018-06-18
  • 打赏
  • 举报
回复
代码传到百度云了,谢谢大佬帮帮忙看下:https://pan.baidu.com/s/1xKs1U2h5DtCorHpneY1d0w

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧