gpt4 book ai didi

c# - 在 C# 中,如何在单独的线程上以随机间隔调用方法,但使其始终按顺序处理?

转载 作者:行者123 更新时间:2023-12-03 12:49:11 25 4
gpt4 key购买 nike

这似乎有一个非常简单的解决方案,但我已经断断续续地寻找了几个月,但没有找到明确的答案。

我有一个由 UI 线程创建的对象。我实际上正在创建几个相同类型的对象。有时我会每分钟创建 1 或 2 个,有时我会在一秒钟内创建 30 个。每次创建一个对象时,我都需要对该对象执行一些计算。短时间内创建的可能 30 个对象的组合,以及我在这些对象上执行的昂贵计算,确实会导致 UI 滞后。

我尝试通过任务和backgroundWorkers以及各种线程执行计算,但它们都无序地执行计算,并且对象必须按照它们创建的顺序进行计算,并且不能启动它一直在计算,直到它前面的对象完成它自己的计算。

我可以找到有关如何并行执行这些任务的各种信息,但是任何人都可以向我解释如何强制它们按顺序发生,而不是在 UI 线程上发生?任何帮助将不胜感激。几个月来我一直在试图解决这个问题:(

最佳答案

IMO,按顺序运行任务的最简单方法是使用 Task.ContinueWith。注意TaskContinuationOptions.LazyCancellation,它用于确保取消不会破坏序列的顺序:

Task _currentTask = Task.FromResult(Type.Missing);
readonly object _lock = new Object();

void QueueTask(Action action)
{
lock (_lock)
{
_currentTask = _currentTask.ContinueWith(
lastTask =>
{
// re-throw the error of the last completed task (if any)
lastTask.GetAwaiter().GetResult();
// run the new task
action();
},
CancellationToken.None,
TaskContinuationOptions.LazyCancellation,
TaskScheduler.Default);
}
}

private void button1_Click(object sender, EventArgs e)
{
for(var i = 0; i < 10; i++)
{
var sleep = 1000 - i*100;
QueueTask(() =>
{
Thread.Sleep(sleep);
Debug.WriteLine("Slept for {0} ms", sleep);
});
}
}

关于c# - 在 C# 中,如何在单独的线程上以随机间隔调用方法,但使其始终按顺序处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23046774/

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