【问题标题】:BackgroundWorker - Form RefreshBackgroundWorker - 表单刷新
【发布时间】:2013-07-09 13:21:23
【问题描述】:

我正在尝试让它在我单击按钮时刷新我的表单。但是我不断收到错误

'跨线程操作无效:控件'Form1'从一个 线程不是创建它的线程。'

 private void button1_Click(object sender, EventArgs e)
    {
        worker.DoWork += formReload;
        worker.RunWorkerAsync();
    }

    static BackgroundWorker worker = new BackgroundWorker();

    private void formReload(object sender, DoWorkEventArgs ev)
    {
        this.Refresh();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {

    }

我试图研究它,我知道我必须使用 Invoke 方法,但是我不明白把它放在哪里,为什么要使用它?任何帮助将不胜感激!

谢谢, 贾罗德

【问题讨论】:

  • 贴一些DoWork的代码,你必须把它放到那个方法中。
  • 将刷新从bg_DoWork移动到bg_runworkercompleted
  • 你可以先用谷歌搜索错误信息...
  • 您好,感谢您的快速回复。我在 DoWork 中什么都没有,所以我发布了 this.Refresh();在那里,但是现在没有错误,但它也不起作用。我的代码中有一个变量,在 form_load 中有一个 switch case,所以如果变量 = 1,那么执行 case 1 中的代码。

标签: c# backgroundworker invoke


【解决方案1】:

实际上你的代码什么都不做,DoWork 是不必要的。您可以将代码重写为:

private void button1_Click(object sender, EventArgs e)
{
    worker.RunWorkerAsync();
}

static BackgroundWorker worker = new BackgroundWorker();

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    if (this.InvokeRequired)
        this.Invoke(new Action(()=>Refresh()));
}

假设你在构造函数中订阅了DoWork方法

worker.DoWork += backgroundWorker1_DoWork;

请注意Refresh 不会改变任何东西。你有什么要刷新的?

【讨论】:

  • 您好,谢谢!错误不再出现,但表单似乎没有重新加载
  • 我已经编辑了回复,你需要重新加载什么?重新加载表单的代码在哪里?
  • 我认为它会刷新所有内容(即使在 form_load 中)。因为我有一个叫做refresh的int,所以每次刷新表单都会加一个。然后我的想法是运行一个开关来获取刷新 int 并在每种情况下绘制不同的东西?如果这有意义
  • Form_Load 仅被调用一次(当第一次实际加载表单时)。如果你想调用它,你不必使用Refresh,而是明确调用它:使用this.Invoke(new Action(()=>form_Load(null,null)));
  • 非常感谢 :) 抱歉浪费您的时间
猜你喜欢
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2014-12-03
相关资源
最近更新 更多