【问题标题】:Passing a control from another thread as a method parameter on other thread将来自另一个线程的控件作为其他线程上的方法参数传递
【发布时间】:2022-11-21 17:40:59
【问题描述】:

我有异步操作,我在其中调用了一个非空方法:

var result = _controller.SendInvoice(this.ParentForm);

我收到错误“跨线程操作无效:从创建它的线程以外的线程访问控件‘ParentForm’”

我已经设法通过编写如下代码来修复它:

ParentForm.Invoke(new MethodInvoker(delegate { _controller.SendInvoice(ParentForm); }));

问题是我必须获得方法 SendInvoice 的返回结果,但是上面的“解决方案”并没有为我解决它,因为它没有从 SendInvoice() 方法返回值。

【问题讨论】:

标签: c# .net multithreading


【解决方案1】:

您可能只想发送数据而不是所有形式。 创建类型 Invoice 并将数据从表单复制到它,并将其发送到您的方法。

Invoice invoice;
//Here copy data
_controller.SendInvoice(invoice); 

【讨论】:

    【解决方案2】:

    问题出在 .Net Framework 中,您无法从非 UI 线程(正是创建表单的线程)访问 ParentForm,但您可以在控件上调用 Invoke。此方法也能够返回一个值。

    var result = (RETURN-TYPE)_controller.Invoke(
        new Func<RETURN-TYPE>(() => _controller.SendInvoice(ParentForm)));
    

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2013-06-27
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多