首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用调用进行C#线程处理,冻结表单

使用调用进行C#线程处理,冻结表单
EN

Stack Overflow用户
提问于 2013-01-28 11:19:14
回答 6查看 30.1K关注 0票数 6

我试图使用线程,并防止程序冻结,而线程是繁忙的。它应该显示进步(0/1的书写),而不只是显示完成后的结果,同时冻结表单。

在当前的程序中,我试图写到一个文本框,实际上看到的是不断的进展,并且表单不会受到其他线程的任务的影响。

现在,我可以使用invoke写入带有线程的textbox,但它只显示结果(当线程繁忙时表单冻结),表单冻结。

表格图像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace MultiThreading
{
public partial class MultiThreading : Form
{
    public MultiThreading()
    {
        InitializeComponent();
    }

    Thread writeOne, writeTwo;

    private void writeText(TextBox textBox, string text)
    {
        if (textBox.InvokeRequired)
        {
            textBox.BeginInvoke((MethodInvoker)delegate()
            {
                for (int i = 0; i < 500; i++)
                {
                    textBox.Text += text;
                }
            });
        }
        else
        {
            for (int i = 0; i < 500; i++)
            {
                textBox.Text += text;
            }
        }
    }
    private void btnWrite1_Click(object sender, EventArgs e)
    {
        writeOne = new Thread(() => writeText(txtOutput1, "0"));
        writeOne.Start();
    }

    private void btnWrite2_Click(object sender, EventArgs e)
    {
        writeTwo = new Thread(() => writeText(txtOutput2, "1"));
        writeTwo.Start();
    }

    private void btnClear1_Click(object sender, EventArgs e)
    {
        txtOutput1.Clear();
    }

    private void btnClear2_Click(object sender, EventArgs e)
    {
        txtOutput2.Clear();
    }

    private void btnWriteBoth_Click(object sender, EventArgs e)
    {
        writeOne = new Thread(() => writeText(txtOutput1, "0"));
        writeTwo = new Thread(() => writeText(txtOutput2, "1"));

        writeOne.Start();
        writeTwo.Start();
    }

    private void btnClearBoth_Click(object sender, EventArgs e)
    {
        txtOutput1.Clear();
        txtOutput2.Clear();
    }
}

}

编辑:

顺便说一句,我对多线程很陌生,我只是尝试编写一个小程序来理解实现这一目的的最佳方法。

我知道我以前的调用并没有提供真正的帮助,因为我仍然没有给表单一个更新的机会,所以它已经实现了。

好的,所以像这样运行一个线程,但是仍然一起运行多个线程,直到线程完成后才会更新表单。

我添加了一个thread.sleep(),以便在编写时可以尝试并清除,以查看是否仍然可以使用该表单。

当写到一个文本框时,我仍然可以在写的时候清除屏幕。

但是一旦我使用了2个线程,在线程完成并给出输出之前,我就不能再使用表单了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void writeText(TextBox textBox, string text)
    {
        for (int i = 0; i < 500; i++)
        {
            Invoke(new MethodInvoker(() =>
            {
                textBox.Text += text;
                Thread.Sleep(2);
            }));
        }

    }

(如果我在这一点上完全错了-我不介意阅读一些例子/线程,除了一个后台工作人员之外,我仍在努力寻找最好的方法。)

编辑2:

我减少了写的数量,减少了调用的次数,但是增加了延迟,产生了与常量写入相同的效果,只是减少了负载。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void writeText(TextBox textBox, string text)
    {
        for (int i = 0; i < 500; i++)
        {
            Invoke(new MethodInvoker(() =>
            {
                textBox.Text += text;
                Thread.Sleep(2);
            }));
        }

    }

编辑3:

Sumeet的示例使用

Application.DoEvents();

(注意s,.DoEvent不工作,可能是:P),同时写入多个字符串&让它们显示进度,而不仅仅是结果。

因此,代码再次更新:)

*使用一个新按钮创建5个线程,将随机数写入两个文本框

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void writeText(TextBox textBox, string text)
    {
        for (int i = 0; i < 57; i++)
        {
            Invoke(new MethodInvoker(() =>
            {
                textBox.Text += text;
                Thread.Sleep(5);
                Application.DoEvents();
            }));
        }

    }
private void btnNewThread_Click(object sender, EventArgs e)
    {
        Random random = new Random();
        int[] randomNumber = new int[5];
        for (int i = 0; i < 5; i++)
        {
            randomNumber[i] = random.Next(2, 9);
            new Thread(() => writeText(txtOutput1, randomNumber[i-1].ToString())).Start();
            new Thread(() => writeText(txtOutput2, randomNumber[i-1].ToString())).Start();
        }
    }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-01-28 11:40:47

这个解决方案有效!已经检查过了。

问题是,您一直告诉UI线程更改文本,但从不让它有时间显示更新的文本。若要使UI显示已更改的文本,请添加如下所示的Application.DoEvents行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
textBox.Text += text;
Application.DoEvents();

附注::删除If / else循环的Else块,它是多余的,而且正如其他人所指出的,创建这2个线程没有任何用处,因为他们所做的只是将消息发布在UI线程本身上。

票数 7
EN

Stack Overflow用户

发布于 2013-01-28 11:22:39

您仍在执行单线程任务,如果需要,只需在UI线程上重新启动它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (int i = 0; i < 500; i++){
    string text = ""+i;
    textBox.BeginInvoke((MethodInvoker)delegate()
            {
                textBox.Text += text;
            });
}
票数 5
EN

Stack Overflow用户

发布于 2013-01-28 11:25:48

问题是您正在启动一个新线程,然后这个新线程除了为UI线程添加一个要处理大量工作的新任务之外,什么也不做。为了保持表单响应性,您需要有时间让UI线程什么也不做,或者至少不要花费大量的时间执行任何一项任务。

为了保持表单响应性,我们需要大量的小BeginInvoke (或Invoke)调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void writeText(TextBox textBox, string text)
{
    for (int i = 0; i < 500; i++)
    {
        Invoke(new MethodInvoker(() =>
        {
            textBox.Text += text;
        }));
    }
}

通过调用大量的小调用,它允许在操作过程中处理诸如画图事件、鼠标移动/单击事件等事件。还请注意,我删除了InvokeRequired调用。我们知道这个方法将从一个非UI线程中调用,所以不需要它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14569482

复制
相关文章
DRAM:实现国产可替代的愿望挺难的
如今,“1bit只要1美元”的厂商早已退出DRAM市场, “三分天下”的局面难以打破,国产内存的希望如星星之火,尚不可燎原。
AI 电堂
2021/08/23
9520
DRAM:实现国产可替代的愿望挺难的
良好的BUG报告可以为您节省宝贵的时间。
一份糟糕的BUG记录不仅烦人,而且大大增加了时间长的开销。为你的下一份BUG报考增加更多更详细的信息,可以使你更快速的定位BUG从而节省时间成本。
疯狂的技术宅
2019/03/27
3700
良好的BUG报告可以为您节省宝贵的时间。
你以为Spring Boot统一异常处理能拦截所有的异常?
这类图相信大家没少见,Spring Boot 只要出错,体现在页面上的就是这个。如果你用Postman之类的测试出了异常则是:
码农小胖哥
2021/05/14
2.5K0
抢了个票,还以为发现了12306的系统BUG
12306在很久以前,对购票和乘车规则是有限制的,当同一乘车人的两张车票涉及的行程出现冲突时,会拒绝购票请求。
Coder的技术之路
2022/09/19
7380
抢了个票,还以为发现了12306的系统BUG
PostgreSQL 为什么Archive 缓慢或不归档,问题的原因在哪里
POSTGRESQL 中是可以对日志进行ARCHIVE 的, 但经常会有一个问题就是ARCHIVE 的速度好像经常没有产生WAL 日志的速度快,有的时候很长一段时间WALLOG 都没有被ARCHIVE, 原因是什么.
AustinDatabases
2020/11/26
1.9K0
jquery 列表可拖动排序 sortable
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jQuery UI Sortable</title> <style type="text/css"> #myList{ width: 80px; background: #EEE; padding: 5px; list-style: none; } #myList a{ text-decoration: none; color: #0077B0; } #myList a:hover{ text-decoration: underline; } #myList .qlink{ font-size: 12px; color: #666; margin-left: 10px; } </style> </head> <body> <ul id="myList"> <li><a href="#">心情</a></li> <li> <a href="#">相册</a> <a href="#" class="qlink">上传</a> </li> <li> <a href="#">日志</a> <a href="#" class="qlink">发表</a> </li> <li><a href="#">投票</a></li> <li><a href="#">分享</a></li> <li><a href="#">群组</a></li> </ul>
用户5760343
2019/10/10
2.4K0
jquery 列表可拖动排序 sortable
POSTGRESQL 以为是BUG,其实是PG的特性 与感谢
昨天的文字中,提到了一个自己认为是POSTGRESQL 问题的文字,就是在建立表的时候,在输错类型后,还是会通过,具体请参见昨天的文字.
AustinDatabases
2021/05/11
6960
POSTGRESQL  以为是BUG,其实是PG的特性 与感谢
归档
归档 基本概念 - 对象归档是指将对象写入文件保存在硬盘上,当再次重新打开程序时,可以还原这些对象。你也可以称他为对象序列化,对象持久化。 数据持久性的方式 NSKeyedArchiver --- 对象归档 NSUserDefaults 属性列表化(NSArray、NSDictionary保存文件) SQlite数据库、Core Data数据库 归档的形式 对Foundation库中对象进行归档 自定义对象进行归档(需要实现归档协议,NSCoding) 归档后的文件是加密的,属性列表是明文的。属性列表也不
用户1941540
2018/05/11
1.2K0
归档
tar是“tape archive”(磁带存档)的简称,它出现在还没有软盘驱动器、硬盘和 光盘驱动器的计算机早期阶段,随着时间的推移, tar命令逐渐变为一个将很多文件进行存档的工具,目前许多用于Linux操作系统的程序就是打包为tar档案文件的形式。 在Linux里面,tar一般和其他没有文件管理的压缩算法文件结合使用,用tar打包整个文件目录结构成一个文件,再用gz,bzip等压缩算法压缩成一次。也是Linux常见的压缩归档的处理方法
酷走天涯
2019/05/26
1.1K0
关于Linux的grep -f命令,我以为我发现了bug
今天,我像往常一样提取基因组的样本,我有一堆样本的ID,需要从所有的基因型的文件中提取出来。
邓飞
2021/09/03
1.2K0
智能图形和列表在哪里呢?慢慢学会SmartArt智能图形和列表。
1、点击[插入] 2、点击[SmartArt] 3、点击[循环] 4、点击[图片] 5、点击[确定]
裴来凡
2022/05/28
9960
智能图形和列表在哪里呢?慢慢学会SmartArt智能图形和列表。
可迭代对象 python_列表是可迭代对象吗
引出问题: ​如下面所示,存在一个类,并且产生了一个对象,现在想用for循环实现对象的迭代,结果报错了
全栈程序员站长
2022/09/21
9160
Bug 看你往哪里逃?我会让你无所遁形
编程中的 Bug ,Error 等各种报错是不可避免的,如果有一个好的 logcat 工具绝对可以帮助大家快速的定位到错误,并高效的找到解决办法。
非著名程序员
2018/07/30
3330
Bug 看你往哪里逃?我会让你无所遁形
通过RMAN设置standby接收日志后主库归档日志才可删除
因为Oracle archivelog会不断生产,一般会设置定期清理archivelog的排程,类似下面。
PHP开发工程师
2021/05/25
1.5K0
【C++11】统一的 {} 列表初始化
​ 在 C++98 中,标准允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定。比如:
利刃大大
2025/03/01
980
【C++11】统一的 {} 列表初始化
主动推理 与 信念-愿望-意图 (BDI)
Active inference models do not contradict folk psychology
CreateAMind
2022/11/22
6950
主动推理 与 信念-愿望-意图 (BDI)
我以为发现了Android 14系统中的一个bug,然而...
事情的起因是这样的,某天工作群里,我看到我们部门的同事guting发了这样一条消息。
用户1158055
2024/01/10
8980
我以为发现了Android 14系统中的一个bug,然而...
tar - 归档
参数 说明 z 创建 gzip 格式的压缩包 j 创建 bz2 格式的压缩包 J 创建 xz 格式的压缩包 x 解压一个压缩包 c 创建一个压缩包 t 查看压缩包的内容 r 把文件追加到压缩包末尾 u 用新的文件替换压缩包中的旧文件 # 创建一个压缩包,排除一些文件 tar zcvf data.tar.gz -T /root/aa -X /root/bb -T:指定需要压缩的目录或文件,需要绝对路径 -X:指定需要排除的文件或目录,需要绝对路径
陳斯托洛夫斯記
2022/10/27
1.4K0
PostgreSQL 13.0-13.15 功能更新和bug fixed列表
在总结了PostgreSQL 12 14 15 16版本的release note和bug fixed的细节后,此次总结最后的一部分 PG13的release note里面的信息。PG13 有15个版本,我们从PG13.1 开始
AustinDatabases
2024/11/25
1490
PostgreSQL 13.0-13.15 功能更新和bug fixed列表
从MYSQL 数据库归档 到 归档设计
到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦。
AustinDatabases
2020/04/24
5.1K0

相似问题

我在哪里为木星小程序归档bug?

10

桌面菜单在哪里归档?

10

在哪里可以为iPad买到Ubuntu?

20

统一设置存储在哪里?

10

哪里可以为Ubuntu 20.04找到GNU 4.3

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文