winform使用后台线程处理,但是由于要显示到winform界面,界面依旧很卡的解决方法

当使用QueryRecord()这类耗时方法时,WinForm界面会出现卡死现象。为了解决这个问题,可以利用后台线程执行任务,但在更新界面控件如TextBox时,必须通过Invoke方法确保UI线程的安全操作。本文介绍了如何在按钮点击事件中运用后台线程和Invoke来避免界面卡顿。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QueryRecord()是一个比较耗时间的方法,而且最终要讲结果显示到TextBox上面。在结果显示在控件上之前,界面处于卡死状态,本人找了很久,最终发现要使用Invoke方法。

private void QueryRecod(string SN, int sponsor, TextBox textShow)
            {
                if (SN == "")
                {
                    MessageBox.Show("PCB码不能为空!");
                    return;
                }
                string strSponse = string.Empty;
                Bobcat queryPCB = new Bobcat();//实例化一个对象
                int reNum = (queryPCB.QuerySfsServerInfo(sponsor, SN, out strSponse));//调用方法;
                List<string> list = new List<string>();//不能使用string[],因为Invoke()方法中参数只会传递stirng[0],stirng[1]、string[2]后续不会传递,结果报错
                list.Add(SN);//添加数据
                list.Add(strSponse);
               
    
           
    
 if (reNum == 1)
        {
  
 **if (textShow.InvokeRequired)//判断是否要跨线程**
            {
                textShow.Invoke(new Action<List<string>>((s) =>**//防止跨线程报错,并且防止界面卡死
                {
                    List<string>** strMes = s as List<string>;
                    textShow.Clear();
                    textShow.Text = "[SN]" + strMes[0] + ":查询失败!" + "\n" + "返回信息:" + strMes[1];
                }), list);
                }**

        }
    

else if (reNum == 0)
    {

  

      if (textShow.InvokeRequired)
        {
            textShow.Invoke(new Action<List<string>>((s) =>
            {
                List<string> strMes = s as List<string>;
                textShow.Clear();
                textShow.Text = "[SN]" + strMes[0] + ":查询成功!" + "\n" + "返回信息:" + strMes[1];
            }), list);
        }
    }
    if (reNum == -1)
    {

        if (textShow.InvokeRequired)
        {
            textShow.Invoke(new Action<List<string>>((s) =>
            {
                List<string> strMes = s as List<string>;
                textShow.Clear();
                textShow.Text = "[SN]" + strMes[0] + ":网络连接超时,请检查网络是否连接!" ;
            }),list);
        }
    }
}

下面是使用一个按钮调用,且使用了后台线程:

ArrayList list = new ArrayList();//把要传递给方法的数据打包
            list.Add(textPCB.Text.Trim());//添加SN
            list.Add(0);//sponssor(0:表示查询过站信息)
            list.Add(textMessage);

            Thread objThread = new Thread((s) =>
            {
                ArrayList list1 = s as ArrayList;//把传递过来的数据从object类型转化为ArrayList;
                string SN = list1[0] as string;
                int sponsor = (int)list1[1];
                TextBox textShow = list1[2] as TextBox;
                QueryRecod(SN, sponsor, textShow);
            });
            objThread.IsBackground = true;
            objThread.Start(list);//表示线程可以开始
### Outlook 认证失败解决方案 对于Outlook认证失败的问题,通常涉及配置错误或权限不足。以下是详细的排查和解决办法: #### 1. 配置AD FS声明规则 如果使用的是企业环境下的Exchange服务,并依赖于AD FS (Active Directory Federation Services) 进行单点登录,则需确保AD FS声明规则设置正确。具体来说,X-MS-Client-Application字段应包含正确的应用程序名称而非`Microsoft.Exchange.PopImap`,因为后者可能导致POP/IMAP客户端无法完成身份验证过程[^1]。 #### 2. 授权第三方应用访问 针对个人邮箱账户(如163邮箱),即使用户名密码无误也可能因未授予相应权限而遭遇认证障碍。此时应当前往目标邮箱的安全中心开启SMTP服务并给予特定设备或程序必要的API调用许可。例如,在某些情况下需要为QQ邮箱这样的外部客户端提供特别授权才能成功连接至163邮箱服务器[^2]。 #### 3. 检查网络环境差异带来的影响 有时同样的代码逻辑在不同运行环境中表现各异。比如Spring Boot项目可能由于Kubernetes集群内部特殊的防火墙策略或是DNS解析问题造成邮件传输协议握手阶段出现问题,进而触发`javax.mail.AuthenticationFailedException`异常。因此建议开发者仔细对比开发机与生产服务器之间的区别所在,必要时调整相关参数设定以适应实际部署场景的需求[^3]。 #### 4. 处理Google SMTP服务器的身份验证需求 当遇到类似于“530 5.5.1 Authentication Required”的提示信息时,这表明当前会话缺少有效的OAuth2令牌或者其他形式的有效凭证。如果是Gmail用户试图通过编程方式发送电子邮件,则务必按照官方文档指引启用两步验证机制以及创建专门的应用专用密码;而对于G Suite管理员而言则需要注意区分普通Gmail账号同付费版本间存在的功能限制——前者不具备管理后台入口[^4]。 ```java // JavaMail API示例:处理身份验证请求 Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密通信 Session session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值