我有一个异步运行的任务,此后还有第二种方法,该方法需要从异步任务中检索信息。 我无法修改异步任务,所以我想知道是否有可能告诉第二种方法等待异步方法完成。
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
方法更新信息。)
答案 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>();