C# asp.net程序在任务完成执行之前继续执行
我尝试在不同的线程上运行3个任务(还会添加一些)。被调用的任务然后调用其他异步/等待的任务 命令等待后,程序继续执行。执行需要等待所有任务完成。下面是我的代码(null返回只是为了测试,我仍然需要创建返回代码)C# asp.net程序在任务完成执行之前继续执行,c#,asp.net,multithreading,async-await,task-parallel-library,C#,Asp.net,Multithreading,Async Await,Task Parallel Library,我尝试在不同的线程上运行3个任务(还会添加一些)。被调用的任务然后调用其他异步/等待的任务 命令等待后,程序继续执行。执行需要等待所有任务完成。下面是我的代码(null返回只是为了测试,我仍然需要创建返回代码) public List<string> CopyFilesAsync(List<ModelIterationModel> model) { var copyFileTaskParameters = GetCopyFileTaskParameters(mod
public List<string> CopyFilesAsync(List<ModelIterationModel> model)
{
var copyFileTaskParameters = GetCopyFileTaskParameters(model);
Task<List<CopyFitDataResult>> fitDataResulLits = null;
Task<List<CopyNMStoreResult>> nmStoreResultsList = null;
Task<List<CopyDecompAnalyzerResult>> decompAnalyzerStoreResultsList = null;
Task parent = Task.Factory.StartNew(() =>
{
var cancellationToken = new CancellationToken();
TaskFactory factory = new TaskFactory(TaskCreationOptions.AttachedToParent, TaskContinuationOptions.ExecuteSynchronously);
factory.StartNew(() => fitDataResulLits = CopyFitDataFiles(copyFileTaskParameters, cancellationToken));
factory.StartNew(() => decompAnalyzerStoreResultsList = CopyDecompAnalyzerFiles(copyFileTaskParameters, cancellationToken));
factory.StartNew(() => nmStoreResultsList = CopyNMStoreResultsFiles(copyFileTaskParameters, cancellationToken));
});
parent.Wait();
return null;
}
这段代码位于WPF应用程序的类库中。我不知道这是否重要,但这是我第一次与WPF交互(仅15年的web开发)
在所有任务完成之前,我需要做些什么来停止执行?我尝试了一些其他的方法,比如像孩子一样依恋,但我所做的一切似乎都不管用
编辑-我一直在尝试直接从MSDN样本中获得的方法,但一点运气都没有。只是尝试了这个
var cancellationToken = new CancellationToken();
var tasks = new List<Task>();
tasks.Add(Task.Run(() =>
{
fitDataResulLits = CopyFitDataFiles(copyFileTaskParameters, cancellationToken);
}));
Task t = Task.WhenAll(tasks.ToArray());
t.Wait();
var cancellationToken=new cancellationToken();
var tasks=新列表();
tasks.Add(Task.Run)(()=>
{
FitDataResults=CopyFitDataFiles(copyFileTaskParameters,cancellationToken);
}));
Task t=Task.WhenAll(tasks.ToArray());
t、 等待();
与MSDN示例完全相同,我尝试了WaitAll,但它正好超过了它。这可能与Visual Studio调试器有关吗?代码中有许多问题:
任务工厂
来开始已经是任务的后台工作
CancellationToken
?您需要创建CancellationTokenSource
,并将其作为令牌
用于所有可能需要取消的代码tasks.Add(Task.Run(() =>
{
fitDataResulLits = CopyFitDataFiles(copyFileTaskParameters, cancellationToken);
}));
不触发CopyFitDataFiles
,它只是分配一个任务引用。您需要执行以下操作:
tasks.Add(CopyFitDataFiles(copyFileTaskParameters, cancellationToken));
您的代码应按以下方式重写:
public async Task<List<string>> CopyFilesAsync(List<ModelIterationModel> model)
{
var copyFileTaskParameters = GetCopyFileTaskParameters(model);
// do not await tasks here, just get the reference for them
var fitDataResulLits = CopyFitDataFiles(copyFileTaskParameters, cancellationToken);
// ...
// wait for all running tasks
await Task.WhenAll(copyFileTaskParameters, ...);
// now all of them are finished
}
// note sugnature change
public async Task CreateConfigFile
{
// if you really need to wait for this task after some moment, save the reference for task
var userFileListModel = _copyFilesToLocalDirectoryService.CopyFilesAsync(temp);
...
// now await it
await userFileListModel;
...
}
公共异步任务CopyFileAsync(列表模型)
{
var copyFileTaskParameters=GetCopyFileTaskParameters(模型);
//不要在这里等待任务,只需获取它们的参考
var FitDataResults=CopyFitDataFiles(copyFileTaskParameters,cancellationToken);
// ...
//等待所有正在运行的任务
wait Task.whalll(copyFileTaskParameters,…);
//现在他们都完成了
}
//注:性质变化
公共异步任务CreateConfigFile
{
//如果您确实需要在某个时间后等待此任务,请保存任务的引用
var userFileListModel=\u copyFilesToLocalDirectoryService.copyfileasync(temp);
...
//现在等待它
等待userFileListModel;
...
}
有一篇关于async/await的好文章@StephenCleary你实际上并不是在等孩子们。你应该实际使用
await
,并且在任何地方都使用它。但是我希望孩子们在不同的线程上运行await Task.whalll(…Task.run…
public async Task<List<string>> CopyFilesAsync(List<ModelIterationModel> model)
{
var copyFileTaskParameters = GetCopyFileTaskParameters(model);
// do not await tasks here, just get the reference for them
var fitDataResulLits = CopyFitDataFiles(copyFileTaskParameters, cancellationToken);
// ...
// wait for all running tasks
await Task.WhenAll(copyFileTaskParameters, ...);
// now all of them are finished
}
// note sugnature change
public async Task CreateConfigFile
{
// if you really need to wait for this task after some moment, save the reference for task
var userFileListModel = _copyFilesToLocalDirectoryService.CopyFilesAsync(temp);
...
// now await it
await userFileListModel;
...
}