c#多线程2个托管只跑了一个

问题描述

c#多线程2个托管只跑了一个

当执行了下属代码后进度条能够正常运行,label1.text并没有根据x值的变化连续变化

 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 WindowsFormsApplication6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        DateTime dt;
        int x = 0;
        int y = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            x = 0;
            Thread myThread = new Thread(DoData);
            Thread myThread1 = new Thread(Viewlabel);
            myThread.IsBackground = true;
            myThread1.IsBackground = true;
            myThread1.Start(int.Parse(textBox1.Text));
            myThread.Start(int.Parse(textBox1.Text)); 

            dt = DateTime.Now;
        }

        private delegate void ViewlabelDelegate(object number);
        private void Viewlabel(object number)
        {
            int i = 1, sum = 0;
            if (label1.InvokeRequired)
            {
                ViewlabelDelegate v = Viewlabel;
                label1.Invoke(v, number);
            }
            else
            {
                bool flag = true;
                while (flag)
                {

                    flag = y < (int)number;

                    sum += i++;
                    label1.Text = sum.ToString();
                    Application.DoEvents();
                }
                MessageBox.Show(sum.ToString());
            }

        }

        private delegate void DoDataDelegate(object number);
        /// <summary>
        /// 进行循环
        /// </summary>
        /// <param name="number"></param>
        private void DoData(object number)
        {
            if (progressBar1.InvokeRequired)
            {
                DoDataDelegate d = DoData;
                progressBar1.Invoke(d, number);
            }
            else
            {
                progressBar1.Maximum = (int)number;
                bool flag = true;
                while (flag)
                {

                    flag = x < (int)number;

                    progressBar1.Value = x;

                    Application.DoEvents();
                }
                MessageBox.Show(DateTime.Now.Subtract(dt).ToString());  //循环结束截止时间
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            x = x + 1;
            y = y + 1;
        }
    }
}

当把Viewlabel代码改为下面代码后sum正常计数

 private void Viewlabel(object number)
{
    int i = 1, sum = 0;

        while (x < (int)number)
        {
            sum += i++;

            Application.DoEvents();
        }
        MessageBox.Show(sum.ToString());

解决方案

if (xxxx.InvokeRequired)是判断是否跨线程,
else后面是调用控件所在线程,也就是主线程来执行的,你将子线程的任务放到主线程上执行了。
所以你才会用到 Application.DoEvents()

解决方案二:

无论你是否多线程,关键在于
Application.DoEvents();

当你修改label的 text,winforms本身不会去修改显示的文字,而是丢一条重绘文本的消息给操作系统,操作系统负责在界面上绘制新的文本。
Application.DoEvents();使得UI线程会处理挂起的消息,其中包含了更新label显示的消息,这样界面才能更新。如果这样的代码得不到执行,当然界面不更新了。

解决方案三:

人才啊,这种跨线程调用控件应该是自创的,完全看不懂。

跨线程调用进度条:
private delegate void DoDataDelegate(int iVal);
private void progressBarVal(int iVal)
{
progressBar1.Value = iVal;
}

工作线程:
{
DoDataDelegate del = new DoDataDelegate(progressBarVal);
progressBar1.invoke(del,new object[] { 50 } );
}

解决方案四:

你这多线程等于没有多线程,的确人才!

时间: 2024-09-19 19:37:37

c#多线程2个托管只跑了一个的相关文章

.net 服务多线程 调用非托管C++DLL 如何防止 服务崩溃?

问题描述 .net 服务多线程 调用非托管C++DLL 如何防止 服务崩溃? 有一个.net服务,服务中开了多线程.其中有一线程会去调用非托管C++DLL,并阻塞等待其返回值.其他线程同步做文件处理.数据状态更新等操作.现在调用非托管C++DLL的线程会因为非托管代码的问题,崩溃.这样整个服务也就崩溃了!需要人工去服务器上重启该服务!请问:如何防止整个服务崩溃?是否可以捕获非托管C++中的错误.因为已经try catch了,但什么都捕获不到,直接服务崩溃! 解决方案 这个应该要想办法解决C++

wparam-按键响应只设置了一个,但是运行其他按键也能响应

问题描述 按键响应只设置了一个,但是运行其他按键也能响应 static int n=10; switch(message) { case WM_CREATE: SetTimer(hwnd9999100NULL); break; case WM_TIMER: if(wParam==9999) InvalidateRect(hwndNULL0); break; case WM_SIZE: //窗口尺寸发生变化时,应该刷新窗口 InvalidateRect(hwndNULL0); break; cas

图片-font-awesome引用了,没出现,只留了一个位置?

问题描述 font-awesome引用了,没出现,只留了一个位置?

【软考视频】只为下一个阶段更好

和J2SE视频相比,软考视频看的过程就比较轻松,更加容易接受.A.B.C三个部分,罗列出来一看,其实只有很少很少的一部分,属于我们没有接触过的.而这些,都属于一些固定的计算或者规则方面的,并不需要我们去做深入研究. [基本内容]     那下面就先从软考A说起,看看自己对它知多少. 除去绿色背景的编译原理部分,其它的都是在自考或者培养计划中学习过至少一遍了,所以,这部分内容看着视频很容易想起之前的东西. 软考B部分的内容,在整理完之后,也觉得挺简单的. 数据库是我们自考和培养计划中都学到过的,而

firefox-火狐浏览器同时提交两个ajax请求,只执行了一个??

问题描述 火狐浏览器同时提交两个ajax请求,只执行了一个?? 文档框有一个change监听事件,当输入完毕,点击提交时,只是执行了change事件,而没有执行提交操作.在点击一次提交,才可以完成提交.再谷歌浏览器,一次点击就可以提交完成.请大神告诉我为什么?

安卓 android 工程-安卓导入的工程 在真机上运行 运行不成功 只安装上一个activity

问题描述 安卓导入的工程 在真机上运行 运行不成功 只安装上一个activity 解决方案 具体是怎么不能运行? 看看logcat,应该有异常信息吧:检查你在AndroidManifest.xml中配置的uses-sdk信息和你真机的Android版本

myeclipse打不开了,只弹出一个对话框,我该怎么办

问题描述 myeclipse打不开了,只弹出一个对话框,我该怎么办 从昨天到今天 我的电脑只要关机后再开机,打开myeclipse的时候就弹出这样一个对话框--"The Myeclipse executable launcher was unable to locate its companion shared library ",我每次都只能卸了重新装,想问一下有其他办法吗? 解决方案 首先重新下个版本的eclipse,比如eclipse-SDK-3.7-win32,你要是64位的系

同IP下,某软件只允许运行一个。这是如何实现的,求解决方案

问题描述 同IP下,某软件只允许运行一个.这是如何实现的,求解决方案 解决方案 解决方案二:服务器判断限制下解决方案三:没有服务器,可以用socket广播,看同一个地址有没有程序在运行解决方案四:版主说的对,有通信吧,由服务器控制解决方案五:把楼上的细化一下就是:A.每几分钟,向你控制下的服务器端发一个请求.服务器端记录请求的IP和MAC地址.当发现数据库中有相同IP,并且登录时间过段,而MAC地址不同,则认为同一局域网有其它程序运行.B.程序开启一个特定非常见端口,新启动时扫描局域网中是否有其

scrollpane-使用ScrollPane默认的BorderLayout布局管理器,只显示最后一个?(请前辈们指教)

问题描述 使用ScrollPane默认的BorderLayout布局管理器,只显示最后一个?(请前辈们指教) import java.awt.BorderLayout;import java.awt.Button;import java.awt.Frame;import java.awt.ScrollPane; public class ScrollPaneTest { public static void main(String[] args){ Frame frame = new Frame