简体   繁体   English

在C#中创建线程

[英]Creating A Thread in C#

Ok so I have the following code: 好的,所以我有以下代码:

public partial class Form1 : Form
{
    private void FileWatcher_Created(object sender, System.IO.FileSystemEventArgs e)
    {
        ListViewItem newFile = new ListViewItem(new string[] { e.FullPath.ToString(), e.ChangeType.ToString() }, -1);
        newFile.Tag = e.FullPath.ToString();
        FileList.Items.Add(newFile);
    }

    private void CopyButton_Click(object sender, EventArgs e)
    {
        BackgroundWorker backgroundWorker1 = new BackgroundWorker();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged +=
          new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int TotalFiles = FileList.CheckedItems.Count;;
        int CurrentFile = 1;
        foreach (ListViewItem CheckedFile in FileList.CheckedItems)
        {
            backgroundWorker1.ReportProgress((CurrentFile / TotalFiles) * 100);
            string FileBuilder = Settings.Default.Destination + Path.GetFileName(CheckedFile.Tag.ToString());
            if (File.Exists(FileBuilder) == false)
            {
                File.Copy(CheckedFile.Tag.ToString(), FileBuilder);
            }
            CurrentFile++;
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        CopyProgressBar.Value = e.ProgressPercentage;
    }
}

It keeps telling me that the report progress method in the DoWork event doesn't exist in the current context, anyone know why? 它不断告诉我,DoWork事件中的报告进度方法在当前上下文中不存在,有人知道为什么吗? Please forgive me if this is a noob error, im new. 如果这是一个菜鸟错误,请原谅我。

backgroundWorker1 is a local variable. backgroundWorker1局部变量。
It doesn't exist outside of CopyButton_Click . 它在CopyButton_Click之外不存在。

You can either put it in a class field, or cast it from the sender parameter. 您可以将其放在类字段中,也可以从sender参数进行sender

private void CopyButton_Click(object sender, EventArgs e)
    {
        BackgroundWorker backgroundWorker1 = new BackgroundWorker();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        backgroundWorker1.RunWorkerAsync();
    }

you BackgroundWorker is init on start method and dispose when finish 您BackgroundWorker在启动方法上处于初始化状态,并在完成后进行配置

try to declare BackgroundWorker in class 尝试在类中声明BackgroundWorker

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.IO;
using FileWatchDog.Properties;
using System.Text.RegularExpressions;

namespace FileWatchDog
{
public partial class Form1 : Form
{
    BackgroundWorker backgroundWorker1;
    public Form1()
    {
        InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void FileWatcher_Created(object sender, System.IO.FileSystemEventArgs e)
    {
        ListViewItem newFile = new ListViewItem(new string[] { e.FullPath.ToString(), e.ChangeType.ToString() }, -1);
        newFile.Tag = e.FullPath.ToString();
        FileList.Items.Add(newFile);
    }

    private void CopyButton_Click(object sender, EventArgs e)
    {
        backgroundWorker1 = new BackgroundWorker();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int TotalFiles = FileList.CheckedItems.Count;;
        int CurrentFile = 1;
        foreach (ListViewItem CheckedFile in FileList.CheckedItems)
        {
            backgroundWorker1.ReportProgress((CurrentFile / TotalFiles) * 100);
            string FileBuilder = Settings.Default.Destination + Path.GetFileName(CheckedFile.Tag.ToString());
            if (File.Exists(FileBuilder) == false)
            {
                File.Copy(CheckedFile.Tag.ToString(), FileBuilder);
            }
            CurrentFile++;
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        CopyProgressBar.Value = e.ProgressPercentage;

    }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM