Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待异步任务的结束_C#_Asynchronous_Task - Fatal编程技术网

C# 等待异步任务的结束

C# 等待异步任务的结束,c#,asynchronous,task,C#,Asynchronous,Task,我有一个异步运行的任务,然后我有第二个方法,需要从异步任务中检索信息。 我无法修改异步任务,所以我想知道是否可以告诉第二个方法等待异步方法完成 foreach (AgentModel ag in Agents) { if (ag.IsEnabledRow == true) { if (ag.IsSelected == true) { if (ag.selectedMatrice != null) {

我有一个异步运行的任务,然后我有第二个方法,需要从异步任务中检索信息。 我无法修改异步任务,所以我想知道是否可以告诉第二个方法等待异步方法完成

foreach (AgentModel ag in Agents)
{
    if (ag.IsEnabledRow == true)
    {
        if (ag.IsSelected == true)
        {
            if (ag.selectedMatrice != null)
            {
                if (ag.selectedWeeks != null)
                {
                    //on vérifie le cycle choisi et on adapte la date en conséquence
                    semaineAAppliquer(ag);

                    ag.IsEnabledRow = false;

                    Task<int> attribuerPlanning = Gestion.AttrPlanning(
                        _dataService.ParamGlobaux.IDEtablissement,
                        _dataService.ParamGlobaux.Matricule,
                        _dataService.ParamGlobaux.ConnectionString,
                        ag.Matricule, ag.selectedMatrice.IDMatrice, DsCalendrierCongés,
                        dateDebutCycle, ag.dateFin, HoraireAZero, CompleterPriseVide,
                        RemplacerRH, JFRepos,
                        (text, title, buttons) => System.Windows.MessageBox.Show(
                            text, title, buttons), _progress, DecalageSemaine,
                            appliquerCouleur, _ToutEtablissement);
                }
            }
            else
            {
                System.Windows.MessageBox.Show($"Sélectionner une matrice pour" +
                    $" l'agent {ag.Nom}.");
            }
        }
    }
}

UpdateListeContrats();
AttriBurPlanning方法是异步方法,我希望在不修改方法本身的情况下,它在调用UpdateListContracts之前结束

或者说UpdateListContracts,在另一个方法完成之前不要触发自己


目前,UpdateListContracts启动时没有通过AttributePlanning方法更新信息。

首先,您实际上不应该等待同步任务,但可以等待异步任务

在这种情况下,最适合这样做的地方可能是:在呼叫站点,即

如果ag.selectedWeeks!=无效的 { //关于周期选择和适应日期顺序 语义应用; ag.IsEnabledRow=false; var结果=等待引导。吸引计划; } 除了简单之外,这还避免了并发问题;大多数代码并不期望在同一上下文中并发使用

在一般情况下,您可以在一个位置捕获任务etc,然后等待它,但在您的情况下,问题变成如何处理foreach/if etc;如果您同时运行这些任务,可能会有零个、一个或多个这样的任务。但我想你可以把它们列在一个清单里,也就是说

var pending=新列表; // ... 待定。添加属性计划; // ... var结果=等待任务。等待时;
首先,您实际上不应该等待同步任务,但可以异步等待

在这种情况下,最适合这样做的地方可能是:在呼叫站点,即

如果ag.selectedWeeks!=无效的 { //关于周期选择和适应日期顺序 语义应用; ag.IsEnabledRow=false; var结果=等待引导。吸引计划; } 除了简单之外,这还避免了并发问题;大多数代码并不期望在同一上下文中并发使用

在一般情况下,您可以在一个位置捕获任务etc,然后等待它,但在您的情况下,问题变成如何处理foreach/if etc;如果您同时运行这些任务,可能会有零个、一个或多个这样的任务。但我想你可以把它们列在一个清单里,也就是说

var pending=新列表; // ... 待定。添加属性计划; // ... var结果=等待任务。等待时;
更新:正如Marc指出的,如果你有一些不应该或者不应该在主线程中被阻止的东西,比如GUI,就不要这样做

你可以做属性规划。等等;打过电话之后

或者,如果要在foreach异步中运行所有任务,并在UpdateListContracts之前等待所有任务完成,则可以在foreach外部创建任务列表:

List<Task> tasks = new List<Task>();
在foreach do之外

Task.WhenAll(tasks).Wait();
UpdateListeContrats();

更新:正如Marc指出的,如果你有一些不应该或者不应该在主线程中被阻止的东西,比如GUI,就不要这样做

你可以做属性规划。等等;打过电话之后

或者,如果要在foreach异步中运行所有任务,并在UpdateListContracts之前等待所有任务完成,则可以在foreach外部创建任务列表:

List<Task> tasks = new List<Task>();
在foreach do之外

Task.WhenAll(tasks).Wait();
UpdateListeContrats();

只需将等待任务属性设置为“计划”。如果UpdateListContracts不在当前方法的范围内,您可以将attributePlanning的.Result放入任务attributePlanning的等待中。如果UpdateListContracts超出了当前方法的范围,您可以为AttributePlanning使用.Result,如果他不想使te方法异步,他也可以使用.Result,顺便说一句,这是一个很好的实践,我想是这样:@EmilianoJavierGonzález accessing.Result不是一个好主意;这是同步超过异步,它可能是有害的,它本质上是一样的。WaitYes我知道:我只是说,使用异步,这是正确的方式,将迫使他使他的方法异步:而且,他可以使用。结果如果他不想使te方法异步,这是一个很好的做法,我猜是这样的:@EmilianoJavierGonzález访问。结果不是一个好主意;这是异步上的同步,它可能是有害的,它本质上与相同。WaitYes我知道:我刚才说,使用异步,这是正确的方法,将迫使他使他的方法异步:。等等。结果是异步上的同步,这在很多情况下都是非常危险的——即使有一点点可能,也应该尽量避免;这通常是一个标志,表明你正在追求异步或同步,这取决于你对不适合的地方的看法。等等,结果是同步超过异步,这在许多情况下是非常危险的,锤子可能是危险的
在很多情况下都是这样:但是在这个例子中你是对的,我刚刚再次检查了他的代码,似乎有一些GUI的东西不应该被等待阻止。我更新我的答案,不这样做。@JohnathanBarclay外部任务将在内部任务完成时完成。这对我有用,或者我错过了什么?@jojess不,你在这方面是对的;Run有一个重载,它接受Func,Func返回内部任务而不是包装它。当除了从同步上下文调用异步代码之外别无选择时,Task.Run和Task.Wait只不过是一种变通方法,这一点无法回避。两者都有各自的缺点,例如任务。等待可能会导致死锁,但您没有提及这一点。如果可能的话,正确的解决方案是根据Marc的回答等待任务。等待和。结果是通过异步同步,这在许多情况下是非常危险的-即使是远程可能,也几乎应该避免;这通常是一个标志,表明你正在追求异步或同步,这取决于你对不适合的地方的看法。等等。结果是同步超过异步,这在很多情况下非常危险。锤子在很多情况下也可能很危险:但你是对的,在这种情况下,我刚刚再次检查了他的代码,似乎有一些GUI的东西不应该被等待所阻止。我更新我的答案,不这样做。@JohnathanBarclay外部任务将在内部任务完成时完成。这对我有用,或者我错过了什么?@jojess不,你在这方面是对的;Run有一个重载,它接受Func,Func返回内部任务而不是包装它。当除了从同步上下文调用异步代码之外别无选择时,Task.Run和Task.Wait只不过是一种变通方法,这一点无法回避。两者都有各自的缺点,例如任务。等待可能会导致死锁,但您没有提及这一点。如果可能的话,正确的解决方法是根据Marc的回答等待任务。