在SynchronizationContext中向SendOrPostCallback传递多个参数

本文关键字:参数 SynchronizationContext 中向 SendOrPostCallback | 更新日期: 2023-09-27 18:24:37

这与我在这里的上一篇文章有关,在那里我问为什么我应该在我的主UI窗体上使用SynchronizationContext的.Send或.post,而不是常规的.Invoke或.BeginInvoke。

我的问题是,我用于Invoke的委托与一个采用两个参数的方法相关联:一个字符串包含标签应更改为的实际文本,另一个字符串则包含文本应更改的标签的名称。

现在的问题是.Send和.Post只接受SendOrPostCallbake委托作为其输入,并且该委托只能与以单个对象为参数的方法相关联。由于所有东西都可以打包到一个对象中,有人建议我要么创建一个类来打包变量(我知道如何实现这个选项),要么使用带闭包的lambda表达式。是后者,我不明白该怎么做。

当我的底层方法有两个字符串参数时,如果有任何关于如何在_synch.Send()中使用lambda表达式的指导,我们将不胜感激。

编辑根据评论中的指导,我能够回答自己的问题。为了未来的访问者,我在下面发布了解决方案。

在SynchronizationContext中向SendOrPostCallback传递多个参数

基于评论中提供的指导,我编写了以下解决方案。

在主UI类中:

public SynchronizationContext UISynchContext { get; private set; }
public static MainForm Get { get; private set; }
public MainForm()
{
    InitializeComponent();
    Get = this;
    UISynchContext = SynchronizationContext.Current;
}
public void UpdateText(string labelName, string text)
{
    var label = (Label)Controls.Find(labelName, true).FirstOrDefault();
    if (label != null) label.Text = text;
}

工人阶级:

private readonly SynchronizationContext _uiSynch;
public Worker(UpdateValueCallback updateValueCallback, Player player)
{
    _uiSynch = MainForm.Get.UISynchContext;
}
_uiSynch.Send(o =>
{
    string labelName = "lbOne";
    string labelText = methodThatReturnsNewText();
    MainForm.Get.UpdateText(labelName, labelText);
}, null);