C# 使用C的后台工作程序#

C# 使用C的后台工作程序#,c#,wpf,properties,C#,Wpf,Properties,我完全迷路了。我似乎没有得到任何回应 BackgroundWorker NewWorker; public void StartBackgroundWorker() { BackgroundWorker NewWorker = new BackgroundWorker(); NewWorker.DoWork += new DoWorkEventHandler(NewWorker_DoWork); NewWorker.Pro

我完全迷路了。我似乎没有得到任何回应

    BackgroundWorker NewWorker;

    public void StartBackgroundWorker()
    {
        BackgroundWorker NewWorker = new BackgroundWorker();
        NewWorker.DoWork += new DoWorkEventHandler(NewWorker_DoWork);
        NewWorker.ProgressChanged += new ProgressChangedEventHandler(NewWorker_ProgressChanged);
        NewWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(NewWorker_RunWorkerCompleted);
        NewWorker.WorkerReportsProgress = true;

        StartWorker();
    }

    void NewWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        for (int i = 1; (i <= 10); i++)
        {
            if ((worker.CancellationPending == true))
            {
                e.Cancel = true;
                break;
            }
            else
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select StatusCode from Win32_PingStatus where address = 'Metabox-PC'");
                ManagementObjectCollection objCollection = searcher.Get();
                foreach (ManagementObject Results in objCollection)
                {
                    MessageBox.Show(Results.ToString());
                }
                // Perform a time consuming operation and report progress.
                System.Threading.Thread.Sleep(1);
                worker.ReportProgress((i * 10));
            }
        }
    }

    private void NewWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("Finished");
    }
BackgroundWorker新员工;
公共无效StartBackgroundWorker()
{
BackgroundWorker NewWorker=新的BackgroundWorker();
NewWorker.DoWork+=新的doworkerventhandler(NewWorker\u DoWork);
NewWorker.ProgressChanged+=新的ProgressChangedEventHandler(NewWorker\u ProgressChanged);
NewWorker.RunWorkerCompleted+=新的runworkercompletedventhandler(NewWorker\u RunWorkerCompleted);
NewWorker.WorkerReportsProgress=true;
StartWorker();
}
void NewWorker\u DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;

对于(inti=1;(i问题在于,您从未启动您的NewWorker。这是因为您的“全局”NewWorker始终为空

请参阅固定代码:

    NewWorker = new BackgroundWorker(); // this line is now fixed.
    NewWorker.DoWork += new DoWorkEventHandler(NewWorker_DoWork);
    NewWorker.ProgressChanged += new ProgressChangedEventHandler(NewWorker_ProgressChanged);
    NewWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(NewWorker_RunWorkerCompleted);
    NewWorker.WorkerReportsProgress = true;

    StartWorker();

问题是你从不启动你的新员工,因为你的“全局”新员工总是空的

请参阅固定代码:

    NewWorker = new BackgroundWorker(); // this line is now fixed.
    NewWorker.DoWork += new DoWorkEventHandler(NewWorker_DoWork);
    NewWorker.ProgressChanged += new ProgressChangedEventHandler(NewWorker_ProgressChanged);
    NewWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(NewWorker_RunWorkerCompleted);
    NewWorker.WorkerReportsProgress = true;

    StartWorker();

您从未在已配置的
BackgroundWorker
上调用
RunWorkerAsync

您认为您是,因为您正在调用
StartWorker
,其中(我猜)包含代码
NewWorker.RunWorkerAsync()
然而,
StartWorker
内部的
NewWorker
指的是一个完全不同的
BackgroundWorker
,您没有配置它来做任何事情

您有一个实例字段,
NewWorker
,以及一个局部变量
NewWorker
,位于
StartBackgroundWorker
的内部,该变量隐藏着实例字段


如果您确实需要后台工作程序作为实例字段,那么不要在
StartBackgroundWorker
中对其进行阴影处理,并始终使用实例字段。如果您不需要将其作为实例字段(记录在案,很可能是这样,并且不必要地将变量升级到实例字段会导致程序更混乱)然后,您只需启动您在
StartBackgroundWorker
中创建的
BackgroundWorker
。如果
StartWorker
确实有足够的代码,需要在另一种方法中使用,那么这可能意味着它应该接受
BackgroundWorker
作为参数,这样您就可以传入您在
S中创建的workertartBackgroundWorker

您从未在已配置的
BackgroundWorker
上调用
RunWorkerAsync

您认为您是,因为您正在调用
StartWorker
,其中(我猜)包含代码
NewWorker.RunWorkerAsync()
然而,
StartWorker
内部的
NewWorker
指的是一个完全不同的
BackgroundWorker
,您没有配置它来做任何事情

您有一个实例字段,
NewWorker
,以及一个局部变量
NewWorker
,位于
StartBackgroundWorker
的内部,该变量隐藏着实例字段


如果您确实需要后台工作程序作为实例字段,那么不要在
StartBackgroundWorker
中对其进行阴影处理,并始终使用实例字段。如果您不需要将其作为实例字段(记录在案,很可能是这样,并且不必要地将变量升级到实例字段会导致程序更混乱)然后,您只需启动您在
StartBackgroundWorker
中创建的
BackgroundWorker
。如果
StartWorker
确实有足够的代码,需要在另一种方法中使用,那么这可能意味着它应该接受
BackgroundWorker
作为参数,这样您就可以传入您在
S中创建的workertartBackgroundWorker

为什么需要将后台工作程序设置为字段?只需将其设置为构造函数和其他类似的内容。在其事件中,您可以将对象强制转换为BackgroundWorker

public void StartBackgroundWorker()
{
    BackgroundWorker NewWorker = new BackgroundWorker();
    NewWorker.DoWork += new DoWorkEventHandler(NewWorker_DoWork);
    NewWorker.ProgressChanged += new ProgressChangedEventHandler(NewWorker_ProgressChanged);
    NewWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(NewWorker_RunWorkerCompleted);
    NewWorker.WorkerReportsProgress = true;

    NewWorker.RunWorkerAsync();
}

为什么需要将后台工作者设置为字段?只需将其设置为构造函数和其他类似的内容。在其事件中,您可以将对象强制转换为BackgroundWorker

public void StartBackgroundWorker()
{
    BackgroundWorker NewWorker = new BackgroundWorker();
    NewWorker.DoWork += new DoWorkEventHandler(NewWorker_DoWork);
    NewWorker.ProgressChanged += new ProgressChangedEventHandler(NewWorker_ProgressChanged);
    NewWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(NewWorker_RunWorkerCompleted);
    NewWorker.WorkerReportsProgress = true;

    NewWorker.RunWorkerAsync();
}

Francis是对的…在GUI线程以外的线程中调用MessageBox的任何尝试都将被阻止。您必须调用:

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => {
    MessageBox.Show("Hello World!");
}));

Francis是对的…在GUI线程以外的线程中调用MessageBox的任何尝试都将被阻止。您必须调用:

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => {
    MessageBox.Show("Hello World!");
}));

谢谢你所有的回答。提供的描述现在对我更有意义了

还有上一个争论:消息框确实阻止了线程。它在10%时卡住了,然后使我的计算机(VM框)崩溃

现在我唯一的问题是
e.results
返回一个项目数组,但它在object中

我发现很难找回数据

public void StartBackgroundWorker()
{

    BackgroundWorker NewWorker = new BackgroundWorker();
    NewWorker.DoWork += new DoWorkEventHandler(NewWorker_DoWork);
    NewWorker.ProgressChanged += new ProgressChangedEventHandler(NewWorker_ProgressChanged);
    NewWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(NewWorker_RunWorkerCompleted);
    NewWorker.WorkerReportsProgress = true;

    NewWorker.RunWorkerAsync();
}

void NewWorker_DoWork(object sender, DoWorkEventArgs e)
{
    List<string> ReturnResults = new List<string>();
    BackgroundWorker worker = sender as BackgroundWorker;

    ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select StatusCode from Win32_PingStatus where address = 'Metabox-PC'");
    ManagementObjectCollection objCollection = searcher.Get();
    foreach (ManagementObject Results in objCollection)
    {
        ReturnResults.Add(Results["StatusCode"].ToString());
    }
    e.Result = ReturnResults;

    // Perform a time-consuming operation and report progress.
    System.Threading.Thread.Sleep(1);
}

private void NewWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    txtPingable.text = e.Result;
}
public void StartBackgroundWorker()
{
BackgroundWorker NewWorker=新的BackgroundWorker();
NewWorker.DoWork+=新的doworkerventhandler(NewWorker\u DoWork);
NewWorker.ProgressChanged+=新的ProgressChangedEventHandler(NewWorker\u ProgressChanged);
NewWorker.RunWorkerCompleted+=新的runworkercompletedventhandler(NewWorker\u RunWorkerCompleted);
NewWorker.WorkerReportsProgress=true;
NewWorker.RunWorkerAsync();
}
void NewWorker\u DoWork(对象发送方,DoWorkEventArgs e)
{
List ReturnResults=新列表();
BackgroundWorker worker=发件人作为BackgroundWorker;
ManagementObjectSearcher searcher=新的ManagementObjectSearcher(“从Win32中选择状态代码,其中地址='Metabox PC'”);
ManagementObjectCollection objCollection=searcher.Get();
foreach(ManagementObject产生objCollection)
{
ReturnResults.Add(Results[“StatusCode”].ToString());
}
e、 结果=返回结果;
//执行耗时的操作并报告进度。
系统线程线程睡眠(1);
}
私有void NewWorker\u RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
txtPingable.text=e.结果;
}
感谢您所有的