等待异步任务结束

时间:2020-04-16 11:41:06

标签: c# asynchronous task

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

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();

attribuerPlanning方法是异步方法,我希望在不修改方法本身的情况下,它在调用UpdateListeContrats之前结束。

或者说一种UpdateListeContrats,在其他方法完成之前不要触发自己。

(当前,updateListeContrats在启动时没有通过attributerPlanning方法更新信息。)

2 个答案:

答案 0 :(得分:5)

首先,您几乎不应该“等待”(同步)任务,但是可以“等待”(异步)任务。

在这种情况下,最合适的位置可能是:在呼叫站点,即

if (ag.selectedWeeks != null)
{
    //on vérifie le cycle choisi et on adapte la date en conséquence
    semaineAAppliquer(ag);

    ag.IsEnabledRow = false;

    var result = await Gestion.AttrPlanning( ... );
}

除了简单之外,这还避免了并发问题;大多数代码不会在同一上下文中预期并发使用。

通常情况下,您可以 在一个地方捕获任务(等),然后稍后等待,但是在您的情况下,问题就变成了如何处理foreach / if等;如果同时运行它们,则可能有零个,一个或许多这样的任务。但是我想您可以将它们放入列表中,即

var pending = new List<Task<int>>();
// ...
            pending.Add(attribuerPlanning);
// ...
var results = await Task.WhenAll(pending);

答案 1 :(得分:-1)

更新:正如Marc所指出的,如果您在主线程中应该禁止或禁止阻塞某些内容(例如GUI),请不要执行此操作。

您可以在调用var1=Hello Sherlock之后进行

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

var2=Hello Avengers

,然后在循环主体中将当前任务添加到列表中:

attribuerPlanning.Wait();

在foreach之外

List<Task> tasks = new List<Task>();