Передача данных в метод обратного вызова (через BeginInvoke) в c # - PullRequest
5 голосов
/ 30 марта 2009

У меня есть следующий код:

    delegate int doStuffDel(int instanceNo, int sleepTime, int repeatCount);
    string result;

    private int doStuff(int instanceNo, int sleepTime, int repeatCount)
    {
        for (int i = 0; i < repeatCount; i++)
        {
            Console.Write(instanceNo);
            Thread.Sleep(sleepTime);
        }
        result = instanceNo + " repeated " + repeatCount;
        return instanceNo;
    }

    private void button3_Click(object sender, EventArgs e)
    {
        doStuffDel del = doStuff;
        IAsyncResult ar = del.BeginInvoke(3, 120, 50, finishedCallback, result);
    }

    private void finishedCallback(IAsyncResult ar)
    {
        Console.WriteLine("Done. The result was " + ar.AsyncState.ToString());
    }

Я думал, что res.AsyncState вернет строку, переданную в качестве последнего аргумента в вызове BeginInvoke, но она равна нулю. Кто-нибудь знает почему?

PS, я знаю, что мог бы передать del в качестве последнего аргумента в BeginInvoke, а затем вызвать EndInvoke в обратном вызове, чтобы получить некоторый результат от метода doStuff, - или я мог бы просто получить строку val из класса! - но я удивлен, что AsyncState на объекте AsyncResult имеет значение null ...

Ответы [ 3 ]

8 голосов
/ 30 марта 2009

Значение ar.AsyncState - это значение результата, когда вы изначально передаете его в BeginInvoke. Тот факт, что когда вы передали его, вы использовали значение result, это не означает, что оно «связано» с переменной результата. Это просто значение переменной result, когда вы передаете ее для начала.

Чтобы увидеть это, либо установите result на некоторое тестовое значение перед вызовом BeginInvoke, либо просто передайте строковый литерал. В любом случае, вы получите это значение в обратном вызове.

С другой стороны, ваш обратный вызов и исходный делегат имеют один и тот же целевой объект, так что вы можете использовать использование result в обратном вызове, и у него будет требуемое значение - это еще один способ поддержания состояния.

1 голос
/ 30 марта 2009

Проблема в том, что вы передаете значение из result - которое (до doStuff) равно null. Обновления до result в пределах doStuff не влияют на состояние асинхронности.

1 голос
/ 30 марта 2009

Передается, когда вы вызываете BeginInvoke. В то время результат равен нулю. Если вы установите результат перед вызовом, вы увидите его в обратном вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...