多个UI订阅来自单个线程的数据+进度报告

时间:2016-10-19 13:13:37

标签: c# winforms task progress

我有一个UI表单(" Main"),它启动一个工作线程(" Engine"),它从一个feed中获取数据。 相同的UI表单能够启动新的相同UI表单("工作空间"),并传递不同的参数,根据引擎中的参数订阅不同的数据更新,如下所示:

public partial class Workspace : Form
    Engine e;

    public Workspace(Engine e, List<Specifications> params)
    {
        InitializeComponent();
        engine = e;
        StartTracking();
    }

    private async void StartTracking()
    {
        var progress = new Progress<Dictionary<string, Data>>(a => UpdateData(a));
        await Task.Factory.StartNew(() => engine.StartTracking(progress), TaskCreationOptions.LongRunning);
    }

    public void UpdateData(Dictionary<string, Data> data)
    {
        statusGrid.DataSource = data.Values.ToList();
    }

我这样做的原因是每个Workspace订阅的数据之间存在很大的重叠,而我宁愿不多次获取相同的数据。

现在的问题是,如果我启动一些新的工作区,只有最新的工作区才会收到更新而其他工作区将停止订阅。我在Main中创建Workspaces如下:

public partial class Main : Form

    var thread = new Thread(() =>
    {
        Workspace f = new Workspace(engine, params);
        Application.Run(f);
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();

public class Engine : IDisposable

    public IProgress<Dictionary<string, Data>> progress;

    public void StartTracking(IProgress<Dictionary<string, Data>> p)
    {
        progress = p;
    }

这是对的吗?

此外,

  • 有没有办法将进度更新重定向到正确的线程?我现在称之为:

    progress.Report(M_DATA);

  • Progress是首选​​方法,还是应该回到使用Invoke / BeginInvoke来更新UI线程?

0 个答案:

没有答案