-1

这与我之前的帖子有关,在那里我问为什么我应该在我的主 UI 表单上使用 SynchronizationContext 的 .Send 或 .Post,而不是常规的 .Invoke 或 .BeginInvoke。

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

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

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

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

4

1 回答 1

0

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

在主 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);
于 2014-09-25T21:05:50.067 回答