gpt4 book ai didi

c# - 混合异步任务和阻塞同步任务

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:32 25 4
gpt4 key购买 nike

我正在编写一组异步任务来下载和解析数据,但是我在更新数据库的下一步中遇到了一些空白。

问题是为了性能,我使用 TableLock 加载相当大的数据集,所以我想要做的是让我的导入服务等待第一个任务返回,开始导入。如果在第一个导入运行时另一个任务完成,则进程加入队列并等待任务 1 的导入服务完成。

例如。

异步 - 任务1 - 任务 2 - 任务 3

同步 - 导入服务

运行异步任务

Task3 returns first > ImportService.Import(Task3)
Task1 return, ImportService is still running. Wait()
ImportService.Complete() event
Task2 returns. Wait()
ImportService.Import(Task1)
ImportService.Complete() event
ImportService.Import(Task2)
ImportService.Complete() event

希望这是有道理的!

最佳答案

你不能在这里真正使用等待,但你可以等待多个任务完成:

var tasks = new List<Task)();
// start the tasks however
tasks.Add(Task.Run(Task1Function);
tasks.Add(Task.Run(Task2Function);
tasks.Add(Task.Run(Task2Function);

while (tasks.Count > 0)
{
var i = Task.WaitAny(tasks.ToArray()); // yes this is ugly but an array is required
var task = tasks[i];
tasks.RemoveAt(i);
ImportService.Import(task); // do you need to pass the task or the task.Result
}

但是在我看来应该有更好的选择。您可以让任务和导入运行并在 ImportService 部分添加一个锁,例如:

// This is the task code doing whatever
....
// Task finishes and calls ImportService.Import
lock(typeof(ImportService)) // actually the lock should probably be inside the Import method
{
ImportService.Import(....);
}

有几件事困扰着我的需求(包括使用静态 ImportService,静态类很少是个好主意),但如果没有进一步的细节,我无法提供更好的建议。

关于c# - 混合异步任务和阻塞同步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329838/

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