Тема: Асинхронність в C# 3

Як написати отакий код тільки правильно?

HttpWebRequest r = null;
foreach (Item b in items)
{
    r = Update(b);
    if (r != null)
    {
        r.BeginGetResponse((IAsyncResult asynchronousResult) => {
            // Код який опрацьовує результат виконання запиту
        }, r);
    }
}

2

Re: Асинхронність в C# 3

Я не шарпіст. Але напишіть, будь ласка, чим саме вас не влаштовує цей код.

3 Востаннє редагувалося javascriptIsLife (02.12.2017 17:36:14)

Re: Асинхронність в C# 3

Тим що може виникнути така ситуація що коли функція

(IAsyncResult asynchronousResult) => {
            // Код який опрацьовує результат виконання запиту
}

буде виконуватися, то зміна r може містити вже зовсім інші дані (інший об'єкт класу HttpWebRequest) а так не можна.

4

Re: Асинхронність в C# 3

Шарп не вміє замикати змінні за значенням? Ну то створюйте локальні копії:

    if (r != null)
    {
        HttpWebRequest local_r = r;//оскільки нова змінна створюється тут, то далі піде посилання конкретно на неї
        local_r.BeginGetResponse((IAsyncResult asynchronousResult) => {
            // Код який опрацьовує результат виконання запиту
        }, local_r);
    }

Звісно, локальна змінна може мати те саме ім'я, що й зовнішня (затінення).

Подякували: FakiNyan, leofun012

5

Re: Асинхронність в C# 3

теж хтів про closures написати... http://csharpindepth.com/Articles/Chapt … sures.aspx

Подякували: leofun011

6

Re: Асинхронність в C# 3

Може розглянути використання класів Mutex або Semaphore?
В першому випадку тільки один потік зможе доступитися до методу, а у випадку з семафором, він поставить їх у чергу і надаватиме доступ по черзі.
Тобто, якщо змінна r у вас оголошується в самому методі, то використання м*ютексу або семафору унеможливить зміну її значення