Несколько экземпляров одной и той же асинхронной задачи (Windows Phone) - PullRequest
0 голосов
/ 26 марта 2012

После долгих поисков и чтения некоторых книг об асинхронных задачах в книгах. Я сделал свою первую программу с асинхронной задачей. Только чтобы узнать, что я могу начать только одну задачу. Я хочу выполнить задачу более одного раза. Вот где я узнал, что это не работает. Чтобы быть немного яснее, вот некоторые части моего кода:

InitFunction(var);

Это сама задача

    public async Task InitFunction(string var)
    {

            _VarHandle = await _AdsClient.GetSymhandleByNameAsync(var);

            _Data = await _AdsClient.ReadAsync<T>(_VarHandle);

            _AdsClient.AddNotificationAsync<T>(_VarHandle, AdsTransmissionMode.OnChange, 1000, this);

    }

Это работает как талисман, когда я выполняю задачу только один раз ... Но есть ли возможность запустить ее несколько раз. Как то так?

InitFunction(var1); 
InitFunction(var2); 
InitFunction(var3);

Потому что, если я делаю это сейчас (несколько задач одновременно), задача, которую он хочет запустить, все еще выполняется, и он выбрасывает исключение.

если бы кто-то мог помочь мне с этим, это было бы здорово!

~ Барт

1 Ответ

2 голосов
/ 26 марта 2012

async / await может отлично работать с несколькими задачами и несколькими задачами одновременно.Однако иногда разные объекты могут накладывать ограничения на количество ожидающих выполнения асинхронных операций за один раз.

Например, класс Ping может использоваться только для отправки одного пинга за раз.Если вы хотите отправить несколько эхо-запросов одновременно, вам нужно использовать несколько Ping экземпляров.

Я подозреваю, что здесь возникает та же проблема: _AdsClient возможно ограничено одной асинхронной операцией за раз,Итак, если вы хотите, чтобы несколько InitFunction были запущены одновременно, вам придется использовать несколько экземпляров любого типа.

С другой стороны, если вы хотите запустить InitFunction несколькораз, по одному, тогда вам просто нужно добавить await s к вашему вызывающему коду:

await InitFunction(var1);
await InitFunction(var2);
await InitFunction(var3);

Это, вероятно, будет работать - если только _AdsClient не имеет семантики "одноразового использования".Некоторые классы имеют это ограничение.

...