C#格式程序中的白色屏幕

时间:2015-07-21 13:05:40

标签: c# multithreading

我目前正在开发一些跟踪CPU使用情况的东西,但是一旦我启动了从CPU中提取数据的线程,屏幕就会变成空白,好像我开始了一个新程序。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Management.Instrumentation;
using System.Management;
using System.Collections.Specialized;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
    Thread cpuData;
    public Form1()
    {

        cpuData = new Thread(new ThreadStart(cpuDataThread));
        cpuData.Start();
    }
    public void cpuDataThread()
    {
        ulong i;
        i = 0;
        try
        {
            ManagementClass cpuDataClass = new ManagementClass("Win32_PerfFormattedData_PerfOS_Processor");

            while (true)
            {
                ManagementObjectCollection cpuDataClassCollection = cpuDataClass.GetInstances();
                foreach (ManagementObject obj in cpuDataClassCollection)
                {
                    if (obj["Name"].ToString() == "_Total")
                    {
                        i = Convert.ToUInt64(obj["C1TransitionsPersec"]);
                    }
                }
                Thread.Sleep(100);
            }
        }
        catch (ThreadAbortException tbe)
        {

        }
        progressBar1.Maximum = 100;
        progressBar1.Minimum = 1;

        progressBar1.Value = (int)i;
    }
}
}

这只是我为个人使用而编写的一个程序,但是想让它正常工作,进度条也无法正常工作,以便获得一些帮助。

3 个答案:

答案 0 :(得分:2)

您的构造函数未调用InitializeComponent(),这是由WinForms设计器创建的方法。

答案 1 :(得分:0)

您可能还需要为线程提供以下属性(开始前方法之前):

cpuData.SetApartmentState(ApartmentState.STA);
cpuData.IsBackground = true;

关注你的第二个问题(进度条)。如果您想将数据传递给UI您需要使用Dispatcher,如下所示:

Dispatcher.Invoke((Action)delegate() { /* update UI */ });

答案 2 :(得分:0)

我用你的代码修改了一下,似乎有效:

您正在使用Win表单,因此我使用的是后台工作程序(" bkwCpuLoad")而不是手动线程。

为了适应这些值,我将最大值设置为10,000:

private void Form1_Load(object sender, EventArgs e)
{
    progressBar1.Maximum = 10000;
    progressBar1.Minimum = 0;
    bkwCpuLoad.RunWorkerAsync();
}

private void bkwCpuLoad_DoWork(object sender, DoWorkEventArgs e)
{
    ulong i;
    i = 0;
    try
    {
        ManagementClass cpuDataClass = new ManagementClass("Win32_PerfFormattedData_PerfOS_Processor");

        while (true)
        {
            ManagementObjectCollection cpuDataClassCollection = cpuDataClass.GetInstances();
            foreach (ManagementObject obj in cpuDataClassCollection)
            {
                if (obj["Name"].ToString() == "_Total")
                {
                    i = Convert.ToUInt64(obj["C1TransitionsPersec"]);
                }
                bkwCpuLoad.ReportProgress((int)i);
            }
            Thread.Sleep(100);
        }
    }
    catch (ThreadAbortException tbe)
    {

    }
}

private void bkwCpuLoad_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    var perc = e.ProgressPercentage;
    if (perc > progressBar1.Maximum)
        perc = progressBar1.Maximum;
    progressBar1.Value = perc;
    try
    {
        progressBar1.Value--;
        progressBar1.Value++;
    }
    catch
    {
    }
}

progressBar1.Value--progressBar1.Value++ bit的出镜:在像你这样的情况下,有一件事情是理想的,就是进度条动画,这太慢了。但是:如果你 reduce 一个进度条值,它不是动画,而是直接绘制。 因此,设置值(动画开始),将其减少1(直接跳转到值)增加它再次使您的进度条基本上更快。 ; - )