C# asp.net程序在任务完成执行之前继续执行

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

我尝试在不同的线程上运行3个任务(还会添加一些)。被调用的任务然后调用其他异步/等待的任务

命令等待后,程序继续执行。执行需要等待所有任务完成。下面是我的代码(null返回只是为了测试,我仍然需要创建返回代码)

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;
    
        ...
    }