c#窗体假死

我有两个按钮,button1和button2还有一个richtext,我的想法是,一个公共变量message,点击button1后,richtext开始刷新(如果mess... 我有两个按钮,button1 和 button2 还有一个richtext,我的想法是,一个公共变量message,点击button1后,richtext开始刷新(如果message为true),点击button2后停止,下述代码仍然会导致ui死掉,点不动button2,请教解决办法。

private Boolean message = true;

private void button1_Click(object sender, EventArgs e)
{

if (this.textBox1.Text==string.Empty && this.textBox2.Text==string.Empty)
{
MessageBox.Show("请配置参数!");
}
else
{
this.button1.Enabled = false;
try
{
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(this.uploader));
th.IsBackground = true;
th.Start();
}
catch(Exception ems)
{
MessageBox.Show(ems.ToString());
}
}
}

private void uploader()
{
while (message)
{
new Thread((ThreadStart)(delegate()
{
this.richTextBox1.Invoke((MethodInvoker)delegate()
{
if (this.richTextBox1.Lines.Length > 100)
{
this.richTextBox1.Clear();
}
richTextBox1.Focus(); //让文本框获取焦点
richTextBox1.Select(richTextBox1.TextLength, 0);//设置光标的位置到文本尾
richTextBox1.ScrollToCaret();//滚动到控件光标处
richTextBox1.AppendText("线程启动!!!/n");//添加内容
richTextBox1.Refresh();

});
})).Start();
}
}
}
```

```

private void button2_Click(object sender, EventArgs e)
{

button1.Enabled = true;
message = false;
}
展开
 我来答
microroom
科技发烧友

2019-03-12 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1534万
展开全部
//问题不大,改成这样就行了:
void button1_Click(object sender, EventArgs e)
{
if (this.textBox1.Text==String.Empty && this.textBox2.Text==String.Empty)
{
MessageBox.Show("请配置参数!");
}
else
{
this.button1.Enabled = false;
message = true;
try
{
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(this.uploader));
th.IsBackground = true;
th.Start();
}
catch(Exception ems)
{
MessageBox.Show(ems.ToString());
}
}
}

void button2_Click(object sender, EventArgs e)
{
button1.Enabled = true;
message = false;
}

private void uploader()
{
while (message)
{
new Thread((ThreadStart)(delegate()
{
this.richTextBox1.Invoke((MethodInvoker)delegate()
{
if (this.richTextBox1.Lines.Length > 100)
{
this.richTextBox1.Clear();
}
richTextBox1.Focus();
richTextBox1.Select(richTextBox1.TextLength, 0);
richTextBox1.ScrollToCaret();
richTextBox1.AppendText("线程启动!!!"+(n++)+"\n");
richTextBox1.Refresh();
});
})).Start();
Thread.Sleep(500);
}
}
private bool message = true;
private int n=1;
匿名用户
2019-03-12
展开全部

给你看一段我的代码片段吧,功能是:多线程上传商品信息到服务器,并且输出文本到richtextbox。界面还有其他同步任务,订单下载,订单上传等。窗体不会卡死。当然在某个特殊时间节点,所有任务都启动的时候,会有短暂的卡顿,然后窗体会恢复正常,这是没办法的,因为对的时候,有十多个同步任务,并且都是多线程执行,电脑系统资源占用大,CPU负载最高满载100%。

/// <summary>
    /// 上传商品
    /// </summary>
    /// <param name="rt"></param>
    /// <param name="bupdate"></param>
    public static void MedicineUpdate(RichTextBox rt, bool bupdate)
    {
        if (FbMedicine_Doing)
            return;
        FbMedicine_Doing = true;
        try
        {
            Log("正在获取药品信息……", rt);
            DataTable dt = xjm.GetMedicine(bupdate);
            if (dt.Rows.Count == 0)
                return;
            Log("找到药品记录:" + dt.Rows.Count.ToString(), rt);
            int iRowCount = dt.Rows.Count;
            int iThCount = ulSystem.StrToInt(Math.Ceiling(double.Parse(iRowCount.ToString()) / 1000).ToString());
            int iFrom = 0, iTo = 1000, iPage = 1000;
            string sql = "";
            List<string> templist = new List<string>();
            for (int ith = 0; ith < iThCount; ith++)
            {
                templist.Clear();
                iFrom = iPage * ith;
                iTo = iPage * (ith + 1);
                if (iTo > iRowCount)
                    iTo = iRowCount;
                for (int i = iFrom; i < iTo; i++)
                {
                    // sql = pt.FmtMedicineSQL(dt.Rows[i]);
                    sql = pt.FmtMedicineSQL_Auto(dt.Rows[i]);
                    templist.Add(sql);
                }
                //创建线程
                Log("创建线程:" + (ith + 1).ToString(), rt);
                ThreadUpdateStock ths = new ThreadUpdateStock(templist, null, 4, ith);
                ths.Execute();
                ulSystem.Delay(2000);
            }
        }
        catch (Exception ex)
        {
            Log("异常:" + ex.Message, rt);
        }
        finally
        {
            Log("上传药品信息执行结束。", rt);
            Log("", rt);
            FbMedicine_Doing = false;
        }
    }

其中需要用到一个延时方法,主要使用的是application.doevents().

代码如下:

    /// <summary>
    /// 非独占延时(毫秒)
    /// </summary>
    /// <param name="milliSecond">延时间隔(毫秒)</param>
    public static void Delay(int milliSecond)
    {
        int start = Environment.TickCount;
        while (Math.Abs(Environment.TickCount - start) < milliSecond)
        {
            Application.DoEvents();
        }
    }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
桐穰Qw
2019-03-11 · TA获得超过6783个赞
知道大有可为答主
回答量:1万
采纳率:74%
帮助的人:467万
展开全部
如果是用控制台的话,是不会有问题的;
如果是用窗体的话,就要用线程。
增加一个引用
using System.Threading;
然后弄一个线程出来
Thread asd = new Thread(abc)
asd.Start();
abc()
{
for(int i = 0;i==i;i++)
{}
}
追问
窗体已经开了线程了,在点击button1后开启一个后台线程,一直刷新richtext,点击button2后更改公共值,但是这时候窗体假死了,停不了。我代码里面写了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
春风够
2019-03-11 · TA获得超过145个赞
知道答主
回答量:1200
采纳率:2%
帮助的人:93.4万
展开全部
using System.Threading;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式