gpt4 book ai didi

c# - 移动/调整窗口大小时任务被阻止

转载 作者:行者123 更新时间:2023-12-03 10:35:48 31 4
gpt4 key购买 nike

我有一个简单的 View 模型,其中包含修改后的 ObservableCollection使用 SynchronizationContext.Current.Send在 UI 线程上执行对集合的更改。该集合由一个长时间运行的后台线程填充。

这在我尝试过的所有不同方式中都可以正常工作,但是在移动窗口或调整窗口大小时它们似乎都被阻止了。

enter image description here
此图中的间隙来自按住窗口标题栏上的鼠标按钮。

我尝试过的不同方法

Task.Factory.StartNew:

Task.Factory.StartNew(
() =>
{
double y = 0;
while (true)
{
Values.Add(new ValuePoint(DateTime.Now, Math.Sin(y)));
y += 0.1;
Thread.Sleep(20);
}
});

ThreadPool.QueueUserWorkItem:
ThreadPool.QueueUserWorkItem(GenerateNumbers);

private void GenerateNumbers(object obj)
{
double y = 0;
while (true)
{
Values.Add(new ValuePoint(DateTime.Now, Math.Sin(y)));

y += 0.1;
Thread.Sleep(20);
}
}

新线程:
_valueSimThread = new Thread(GenerateNumbers);
_valueSimThread.IsBackground = true;
_valueSimThread.Start();

我在这里误解了什么吗?我的期望是线程中完成的工作不应该受到我在 UI 线程上所做的事情的影响。是使用 SynchronizationContext.Current.Send的 Action 吗?更新集合我的问题的来源?

拥有 ObservableCollection 的正确“模式”是什么?由后台任务更新?

最佳答案

Is it the action of using SynchronizationContext.Current.Send to update the collection the source of my problem?



是的。 SynchronizationContext.Send最终会将委托(delegate)发布到您的 UI 线程。当您移动屏幕时,UI 会显示许多关于窗口新位置、鼠标单击等的消息。因此,最终,您将工作排队到当前已占用的 UI 线程。

只要您使用某种绑定(bind)到 UI 的集合,您就没有其他方法可以将工作排队到该 UI 消息循环中。

关于c# - 移动/调整窗口大小时任务被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30056036/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com