我有一个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线程?