【问题标题】:SynchronizationContext.Post to UI Method - update multiple labelsSynchronizationContext.Post 到 UI 方法 - 更新多个标签
【发布时间】:2020-07-08 12:32:46
【问题描述】:

在下面的代码sn -p中,如何更新多个标签? 例如:更新方法中有多个参数而不是一个参数

 private void UIupdate(string name)
        {
            var timenow = DateTime.Now;
            if((DateTime.Now-dt).Milliseconds<=50)
                return;
            synchronizationcontext.Post(new SendOrPostCallback(o =>
            {
                
                lblFirstName.Text = "name" + (string)o;
                //lblLastName.Text = ?
                //lblZipCode.Text=?
            }),name );
            dt = timenow;
        }

【问题讨论】:

  • 然后改为字符串发布多个字符串(数组/列表)或一些自定义 poco 类
  • 离题:你为什么使用 synchronizationcontext 而不是普通的 async/await ?为什么这个问题有 WCF 标签?
  • 可以发一份代码示例吗?
  • 什么例子?而不是 name 发布 new string[] { name , something, somethingelse } 然后将 o 转换为 string[] 并从数组中读取值并分配给正确的 UI 元素
  • 我删除了 wcf 标签

标签: c# multithreading lambda async-await


【解决方案1】:

您可以简单地使用 lambda 中的方法参数。这些参数被捕获在closure 中,并且可供方法的所有内部函数使用。

private SynchronizationContext _synchronizationContext;
private Stopwatch _stopwatch = Stopwatch.StartNew();
private TimeSpan _lastUpdateTimestamp;

private void UIUpdate(string firstName, string lastName)
{
    TimeSpan timestamp = _stopwatch.Elapsed;
    if (timestamp < _lastUpdateTimestamp.Add(TimeSpan.FromMilliseconds(50))) return;
    _lastUpdateTimestamp = timestamp;

    _synchronizationContext.Post(_ =>
    {
        lblFirstName.Text = firstName;
        lblLastName.Text = lastName;
    }, null);
}

我还修正了你的计时逻辑。 Milliseconds 仅计算当前秒的毫秒数(值介于 0 和 999 之间)。您可能打算使用TotalMilliseconds。但即便如此,您的测量也将取决于系统时钟的稳定性。系统时间可以通过用户操作或自动程序进行调整,因此不能信任它来测量间隔。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2016-11-14
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多