У меня есть асинхронной делегат, который я жду в методе асинхронном:Как написать метод расширения, который заставит элементы списка вызовов в многоадресном делете C# запускаться последовательно?
async Task M1()
{
Debug.WriteLine("M1.A");
await Task.Delay(10);
Debug.WriteLine("M1.B");
}
async Task M2()
{
Debug.WriteLine("M2.A");
await Task.Delay(1);
Debug.WriteLine("M2.B");
}
delegate Task MyDel();
async void button_Click(object sender, RoutedEventArgs e)
{
MyDel del = null;
del += M1;
del += M2;
await del();
}
Выход есть:
M1.A
M2.A
M2.B
M1.B
То есть, оба члены Призыва идут выключаться одновременно, не дожидаясь друг друга. Мне нужно их ждать друг друга, так что результат будет:
M1.A
M1.B
M2.A
M2.B
Я попытался это вместо await del()
:
foreach (MyDel member in del.GetInvocationList())
{
await member();
}
Это работает. Тем не менее, у меня много кодовых мест, где это нужно сделать. Делегаты могут иметь различное количество параметров различных типов, но все они возвращают Task
.
Как написать метод расширения, который позволит мне запустить код выше, выполнив такие вызовы?
del0.AwaitOneByOne(); // del0 is 'delegate Task Method()'
del1.AwaitOneByOne(paramInt1, paramStr2); // del1 is 'delegate Task Method(int, string)'
del2.AwaitOneByOne(paramBytes1); // del2 is 'delegate Task Method(byte[])'
Это потоковая раса ошибка, вы не можете это исправить путем разбрызгивания волшебной феи пыли. Если в вашей программе много ошибок, вам придется переписать много кода. –
Итак, в основном вам нужна коллекция задач, которые должны запускаться последовательно. Я прав? Может быть, проще просто написать класс именно для этого? По моему мнению, вы используете 'delegate', потому что он обеспечивает бесплатную добавление/удаление и подпись. Таким образом, как идея может быть проще взглянуть на «событие» и переопределить добавление/удаление в пользовательский метод, который будет связывать задачи вместо их параллелизма. Конечно, если вам нужно «поднять событие» за пределами своего владельца, будет непросто, поэтому вы можете абстрагироваться от этого в каком-то вспомогательном классе. – Lanorkin
@ Lanorkin Возможно, для будущих проектов .. Решение от Mant101 будет достаточно в это время. – Alex