【问题标题】:How to fix backgroundWorker1.RunWorkerAsync() does not exist in current context如何修复当前上下文中不存在 backgroundWorker1.RunWorkerAsync()
【发布时间】:2021-08-18 09:30:48
【问题描述】:

我按照教程一步一步地 ping 多个 IP 地址,并在 ping 结果中分别显示红色框或绿色框(红色 - 失败,绿色 - 成功)

我现在卡在上面写着backgroundWorker1.RunWorkerAsync() does not exist in current context.的这一点上

public partial class Form1 : Form
{
    DataTable pingTable = new DataTable();
    List<string> ipAddress = new List<string>();
    List<PictureBox> pictureboxList = new List<PictureBox>();
    private System.Timers.Timer timer;
    public Form1()
    {
        InitializeComponent();

        timer = new System.Timers.Timer();
        timer.Interval = 5000;
        timer.Enabled = true;
        timer.Elapsed += timer_Elapsed;
    }

    private void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void FillPingTable()
    {
        pingTable.Columns.Add("ip", typeof(string));
        pingTable.Columns.Add("picturebox", typeof(string));

        pingTable.Rows.Add();
        for(int i = 0; i< ipAddress.Count; i++)
        {
            pingTable.Rows.Add(ipAddress[i], pictureboxList[i]);
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        using (var reader = new StreamReader(@"C:\Users\Admin\Network\ipAddress.csv"))
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split('\n');
                ipAddress.Add(values[0]);
            }

            for(int i = 1; i<= 57; i++)
            {
                pictureboxList.Add((PictureBox)Controls.Find("pictureBox" + i, true)[0]);
            }

            FillPingTable();

            backgroundWorker1.RunWorkerAsync();
        }
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(500);
        Parallel.For(0, ipAddress.Count(), (i, loopSate) =>
        {
            Ping ping = new Ping();
            PingReply pingReply = ping.Send(ipAddress[i].ToString());
            this.BeginInvoke((Action)delegate ()
            {
                pictureboxList[i].SizeMode = PictureBoxSizeMode.Zoom;
                pictureboxList[i].BackColor = (pingReply.Status == IPStatus.Success) ? Color.Green : Color.Red;
            });
        });
    }

我已经仔细检查了这些步骤,但在这里找不到我做错了什么?

我使用的是最新版本的 Visual Studio。

谢谢

【问题讨论】:

  • 你的 backgroundWorker1 是否在设计器中创建?也许您在设计器中对其进行了重命名,但代码仍然具有旧字段名称?显然,您可以通过简单地添加“private BackgroundWorker backgroundWorker1 = new BackgroundWorker();”将其实例化为该文件中的一个字段。其中定义了类的其他字段。
  • 哈哈!我知道我错过了一些东西,有一点错字问题 :-( 感谢您的帮助 :-)
  • 如果有帮助,请将我的回答标记为已接受。谢谢!
  • 我现在唯一的问题是它没有ping通csv文件中的IP?
  • 您是否尝试过在 backgroundWorker1_DoWork 中设置断点?如果未命中此断点,则您可能缺少 BackgroundWorker 的初始设置(例如订阅其 DoWork 事件,如 backgroundWorker1.DoWork += backgroundWorker1_DoWork;)

标签: c# winforms


【解决方案1】:

您似乎缺少 backgroundWorker1 实例。当然,这取决于您所遵循的教程。

您可能需要在设计器中创建一个 BackgroundWorker 组件,并且可能错过了该步骤。此外,您可能已经重命名了该组件,但它并未在您的代码隐藏文件中重命名。

或者,您需要自己将实例创建为字段,然后您只需将以下行添加到 Form1 类的开头:

private System.ComponentModel.BackgroundWorker backgroundWorker1 = new BackgroundWorker();

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 2019-06-23
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多