【问题标题】:Label click event to run on a new thread in C#标签单击事件以在 C# 中的新线程上运行
【发布时间】:2020-03-13 20:10:40
【问题描述】:

我在数据库数据的帮助下动态生成一些标签。然后我为这些动态生成的标签添加了一些事件。我正在尝试在新线程中运行标签的点击事件。但到目前为止我无法弄清楚。任何线索都会非常有帮助。

private void LoadData(string DeviceCode)
{
    //here i am generating the labels (not shown)
    //adding the event handler
    lb_DeviceData[i].Click += new EventHandler(CalculateClick);
    lb_DeviceData[i]..Tag = i;
}

private void CalculateClick(object sender, EventArgs e)
{
    Label MyLabel = (Label)sender;
    Thread t = new Thread(ThreadedMethodForCalc);    //can i pass MyLabel into this method?
    t.Start();
}

private void ThreadedMethodForCalc()
{
   //complex calculation here
   // is it possible to pass 'MyLabel' in this method
}          

【问题讨论】:

  • 是您将 MyLabel 值传递给另一个函数的问题,还是您不知道如何为这些标签动态创建点击事件的问题?
  • 这段代码做了什么你不想要的?还是不按你的意愿去做?
  • 你可以将控件传递给你想要的,你也可以将它保存到静态变量中,每个线程都可以访问它。没问题。但是与该控件进行通信可能会变得困难,因为您只能从创建控件的线程中调用该控件的方法。这可以处理,但这是一项额外的工作。 (检查控件的 InvokeRequired 属性)
  • 我认为使用 async/await 将是一个可行的选择。你需要用MyLabel做什么?设置文本?那么您可能希望将 IProgress 与 async/await Task 一起使用 ...
  • @rory.ap 我不知道 OP 的技能水平。这是一种替代方案,我个人认为它比在这种情况下使用线程更具可读性和直接性一百万倍。但无论如何,这不是问题的答案。只是想指出,还有另一条可以遵循的路线。

标签: c# multithreading


【解决方案1】:

你的方法可以接受标签

private void ThreadedMethodForCalc(object label)
{
    Label MyLabel = (Label)label;
    //complex calculation here
    // is it possible to pass 'MyLabel' in this method
} 

然后在线程中使用Start

t.Start(sender);

但不允许在 UI 线程之外修改控件属性

【讨论】:

    【解决方案2】:

    嗯,最简单的方法是更改​​方法的签名并使用closure:

    Thread t = new Thread(() => ThreadedMethodForCalc(MyLabel));
    t.Start();
    
    ...
    
    private void ThreadedMethodForCalc(Label myLabel)
    {
    }
    

    顺便说一句,要在另一个线程中更新 UI,您可以使用 Control.Invoke(...)。

    有关更多信息,请查看 MSDN 的 this article。

    【讨论】:

    • @PavelAnikhouski 是的,但只允许 object,然后你必须将其转换回原来的类型
    • 这行得通。我所有的表单控件都在主线程中。在这个计算线程中,我想改变主线程中的一些显示。我在 ThreadedMethodForCalc 中尝试过,得到如下错误! System.InvalidOperationException:'跨线程操作无效:控制'MainPanel'从创建它的线程以外的线程访问。'
    • @sunny_old_days 检查.Invoke 函数和我在答案中发布的文章
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多