【问题标题】:UDP listener on a thread and posting to GUI线程上的 UDP 侦听器并发布到 GUI
【发布时间】:2013-03-14 14:37:58
【问题描述】:

我正在运行一个基于对话框的程序,它定期发送 TCP,但也侦听 UDP 消息并将内容显示到 GUI。使用我最初使用的简单示例,一旦我开始在 while(true) 中监听,所有其他 GUI 功能都被关闭。然后我尝试生成一个线程来进行监听,但这些示例要求我创建一个新类,该类将 GUI 元素从我的视图中隐藏起来。

所以我的问题是,在不阻塞 GUI 线程的情况下侦听 UDP 消息并将内容写入 GUI 的最佳做法是什么?

【问题讨论】:

  • 最佳实践是什么?在单独的线程上监听 udp 消息。这就是你在不阻塞 GUI 的情况下做任何事情的方式。
  • 特别重要的部分是关于写入 GUI。下面提到的报告进度

标签: c# multithreading user-interface udp


【解决方案1】:

您需要让代码在某种后台线程中进行监听。这很简单,从Thread 类、BackgroundWorkerTaskThreadPool.QueueUserWorkItem(尽管在您的情况下,线程池线程是不合适,您需要一个完整的线程,因为您的操作需要长时间运行)等。

之后,您只需要某种方式来更新 UI。同样,有几种方法可以这样做(一些特定于您正在使用的 UI 功能(WPF、winform 等),而另一些则不是。

使用IProgress<T> 特别有用,尤其是因为它不依赖于特定的 UI 技术。在 UI 中创建 Progress 对象,并指定当您有特定结果时如何更新 UI,将对象传递给后台工作人员,并在其接收信息时使其 Report 进度。

示例可能如下所示:

private void Form1_Load(object sender, EventArgs e)
{
    Progress<string> progress = new Progress<string>();
    progress.ProgressChanged += data =>
    {
        textBox1.AppendText(data);
    };

    Thread tcpListener = new Thread(() => ListenForData(progress));
    tcpListener.Start();
}

private void ListenForData(IProgress<string> progress)
{
    while (true)
    {
        Thread.Sleep(1000);//placeholder for real IO to get data
        progress.Report("data");
    }
}

如果您没有 C# 4.5,则创建自己的 Progress 类非常简单:

public interface IProgress<T>
{
    void Report(T data);
}

public class Progress<T> : IProgress<T>
{
    SynchronizationContext context;
    public Progress()
    {
        context = SynchronizationContext.Current
            ?? new SynchronizationContext();
    }

    public Progress(Action<T> action)
        : this()
    {
        ProgressReported += action;
    }

    public event Action<T> ProgressReported;

    void IProgress<T>.Report(T data)
    {
        var action = ProgressReported;
        if (action != null)
        {
            context.Post(arg => action((T)arg), data);
        }
    }
}

【讨论】:

  • 后台工作人员是我一直在寻找的。我以前用过它,但我不记得它到底叫什么了。谢谢。
  • 我没有.Net4.5。我认为我无法访问 IProgress。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2015-08-06
  • 1970-01-01
  • 2018-03-07
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多