gpt4 book ai didi

c# - 使用 TPL 的协作式多任务处理

转载 作者:太空狗 更新时间:2023-10-29 21:57:33 26 4
gpt4 key购买 nike

我们正在移植建模应用程序,它使用 IronPython 脚本在建模过程中执行自定义操作。现有应用程序在单独的线程中执行每个 Python 脚本,并为此使用协作模型。现在我们想把它移植到 TPL,但首先我们想测量上下文切换.基本上,我们现在拥有的是:

  1. 任务的队列
  2. 此队列中的每个 Task 执行一个 IronPython 脚本
  3. 在IronPython脚本中我们调用C#类方法,这是同步点,应该将Task(IronPython执行)转移到等待状态

我们想做的:

  1. 我们想要无限循环,它将遍历 Task 的队列
  2. 当我们得到一个任务时,我们尝试执行它
  3. 在 PythonScript 中,我们要调用 C# 方法并将此脚本转移到等待状态。但不将其从队列中移除。
  4. 在下一次迭代中,当我们获得另一个 Task 时,我们检查它是否处于等待状态。如果是这样,我们将其唤醒并尝试执行。
  5. 在每一时刻我们应该只有一个事件的Task
  6. 最后我们想测量我们每秒可以执行多少个Task

我真的不知道这与协作式多任务处理有关吗?我们正在考虑自定义 TaskScheduler,这是个好方法吗?或者有人知道更好的解决方案吗?

谢谢。

更新:

好的,例如,我有这样的代码:

public class CooperativeScheduler : TaskScheduler, IDisposable
{
private BlockingCollection<Task> _tasks;

private Thread _thread;

private Task _currentTask;

public CooperativeScheduler()
{
this._tasks = new BlockingCollection<Task>();
this._thread = new Thread(() =>
{
foreach (Task task in this._tasks.GetConsumingEnumerable())
{
this._currentTask = task;

TryExecuteTask(this._currentTask);
}
}
);

this._thread.Name = "Cooperative scheduler thread";

this._thread.Start();
}

public void SleepCurrentTask()
{
if (this._currentTask != null)
{
// what to do here?
}
}

protected override IEnumerable<Task> GetScheduledTasks()
{
return this._tasks.ToArray<Task>();
}

protected override void QueueTask(Task task)
{
// No long task
this._tasks.Add(task);
}

protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
throw new NotImplementedException();
}

public void Dispose()
{
this._tasks.CompleteAdding();
this._thread.Join();
}
}

Custom Task Scheduler,它有一个用于任务执行的_thread和用于运行任务的_currentTask字段,在这个方法中它还有一个SleepCurrentTask我想暂停当前任务执行,但我不知道如何。

客户端代码很简单:

    CancellationTokenSource tokenSource = new CancellationTokenSource();
Application app = Application.Create();


Task task = Task.Factory.StartNew(() =>
{
app.Scheduler.SleepCurrentTask();
},
tokenSource.Token, TaskCreationOptions.None, app.Scheduler);
}

也许有人有更好的主意?

最佳答案

听起来您最好使用 .NET 4 内置到一些集合中的生产者/消费者模式。

查看 Microsoft 免费 PDF 中的第 55 页,Patterns of Parallel Programming

关于c# - 使用 TPL 的协作式多任务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921930/

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