gpt4 book ai didi

c# - 无阻塞的顺序异步任务

转载 作者:太空狗 更新时间:2023-10-30 00:46:06 26 4
gpt4 key购买 nike

我有一个 C# WPF 应用程序,它使用了一种相当不错的 MVVM 方法。在其中一个 ViewModel 中,我想按顺序运行一系列任务,但希望每个任务异步运行到主线程。我想要能够报告任务之间进度的粒度,但我不想在任何任务运行时阻止 GUI。

是否有实现此目标的标准方法或“最佳实践”?

我已经实现了一些使用 BackgroundWorker 的东西,我感到既高兴又有点害怕。启动整个过程的代码感觉特别非 C#ish。我觉得必须有更好的或者至少是既定的方法来做到这一点。

非常感谢您的建议。


这是拼凑的选项:

protected void runAsyncTask(SequentialTask seqTask)
{
if (HasErrored) return;

DoWorkEventHandler worker = (s, e) =>
{
setTaskStartStatusMessage(seqTask.TaskMessage);
ShowProgress = true;
seqTask.Task((BackgroundWorker)s);
};

ProgressChangedEventHandler progress = (s, e) =>
{
if (seqTask.TaskProgress != null)
seqTask.TaskProgress(e.ProgressPercentage, e.UserState);
};

RunWorkerCompletedEventHandler done = null;
done = (s, e) =>
{
ShowProgress = false;
if (e.Error != null)
{
HasErrored = true;
displayTaskExceptionMessage(e.Error, seqTask.TaskMessage);
}
else
{
setTaskCompleteStatusMessage(seqTask.TaskMessage);
if (seqTask.TaskComplete != null)
seqTask.TaskComplete();
}
((BackgroundWorker)s).RunWorkerCompleted -= done;
((BackgroundWorker)s).DoWork -= worker;
((BackgroundWorker)s).ProgressChanged -= progress;

if (seqTask.NextTask != null && (seqTask.CanExecuteNext == null ? true : seqTask.CanExecuteNext()))
runAsyncTask(seqTask.NextTask);
};

if (seqTask.TaskProgress != null)
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += worker;
backgroundWorker.RunWorkerCompleted += done;
backgroundWorker.ProgressChanged += progress;
backgroundWorker.RunWorkerAsync();
}

SequentialTask​​ 只是一组简单的属性:

public class SequentialTask
{
public Action<BackgroundWorker> Task { get; set; }
public String TaskMessage { get; set; }
public Func<bool> CanExecuteNext { get; set; }
public Action<int, object> TaskProgress { get; set; }
public Action TaskComplete { get; set; }
public SequentialTask NextTask { get; set; }
}

这导致类似 Perl 的语法:

runAsyncTask(new SequentialTask()
{
Task = (x) => loadFile(),
TaskMessage = "Load File",
CanExecuteNext = null,
NextTask = new SequentialTask()
{
Task = (x) => validateImport(),
TaskMessage = "Validate Input Lines",
TaskComplete = () =>
{
if (!ImportIsValid)
displayValidationMessages();
},
CanExecuteNext = () => ImportIsValid,
NextTask = new SequentialTask()
{

等等

最佳答案

您是否看过 .NET 4.0 中的任务并行库 (TPL)?这允许你做这样的事情:

Task firstTask = new Task(()=>RunStepOne());
firstTask.ContinueWith(task=>()=>RunSecondStep());
firstTask.Start();

有大量选项可用于创建、继续和停止构建在 TPL 上的任务。它肯定值得一看。

关于c# - 无阻塞的顺序异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4134641/

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