none
Не вызывается метод завершения асинхронной операции для перегрузки FromAsync<TResult>(Func<AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, Object) RRS feed

  • Вопрос

  • Доброго времени суток.

    (Visual Studio 2019 C# WindowsForms NetFrameWork 4.7.2)


    Пример:

          private async void button4_Click(object sender, EventArgs e)
            {
                Func<string> DownloadTest = () => "TEST";

                //задача выполняется
                TextBox1.Text += await new TaskFactory().FromAsync(DownloadTest.BeginInvoke(null, null), (iasr) => DownloadTest.EndInvoke(iasr));


                //Не выполняется метод завершения асинхронной операции
                TextBox1.Text += await new TaskFactory().FromAsync((Func<AsyncCallback, object, IAsyncResult>)delegate { return DownloadTest.BeginInvoke(null, null); }, (iasr) => DownloadTest.EndInvoke(iasr), null);

                //Не выполняется метод завершения асинхронной операции
                TextBox1.Text += await new TaskFactory().FromAsync((a1,a2)=> DownloadTest.BeginInvoke(null, null), (iasr) => DownloadTest.EndInvoke(iasr), null);

            }


    ------------------------------------------------------------------------------------------------------------------------------------------------------
    При реализации перегрузки метода: FromAsync<TResult>(IAsyncResult, Func<IAsyncResult,TResult>) задача выполняется успешно.

    Вариант-1.
    TextBox1.Text += await new TaskFactory().FromAsync(DownloadTest.BeginInvoke(null, null), (iasr) => DownloadTest.EndInvoke(iasr));
    ------------------------------------------------------------------------------------------------------------------------------------------------------
    Не выполняется метод завершения при реализации перегрузки:
    FromAsync<TResult>(Func<AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, Object)

    //Вариант-2.
    TextBox1.Text += await new TaskFactory().FromAsync((Func<AsyncCallback, object, IAsyncResult>)delegate { return DownloadTest.BeginInvoke(null, null); }, (iasr) => DownloadTest.EndInvoke(iasr), null);

    //Вариант-3.
    TextBox1.Text += await new TaskFactory().FromAsync((a1,a2)=> DownloadTest.BeginInvoke(null, null), (iasr) => DownloadTest.EndInvoke(iasr), null);

    Метод:
    (a1,a2)=> DownloadTest.BeginInvoke(null, null);
    или
    (Func<AsyncCallback, object, IAsyncResult>)delegate { return DownloadTest.BeginInvoke(null, null); };
    который начинает асинхронную операцию выполняется, но не понятно почему в метод завершения не передаётся тип IAsynsResult.



    Если например например для первого варианта прописать вместо первого "null" в методе DownloadTest.BeginInvoke свой "callback", то будет
    вызыватся свой callback и метод завершения (iasr) => DownloadTest.EndInvoke(iasr).

    Если сделать тоже для второго и третьего варианта, то вызывается только свой "callback", а метод завершения не вызывается.


    Я что-то не так сделал?
    18 декабря 2020 г. 8:05

Ответы

  • Ваши делегаты игнорируют переданные аргументы, а должны передавать их в BeginInvoke вместо null.
    • Помечено в качестве ответа Y_VS 18 декабря 2020 г. 21:58
    18 декабря 2020 г. 16:42

Все ответы

  • Ваши делегаты игнорируют переданные аргументы, а должны передавать их в BeginInvoke вместо null.
    • Помечено в качестве ответа Y_VS 18 декабря 2020 г. 21:58
    18 декабря 2020 г. 16:42
  • Ваши делегаты игнорируют переданные аргументы, а должны передавать их в BeginInvoke вместо null.

    Cпасибо, за ответ.

    Надо для анонимного делегата добавить параметры delegate(AsyncCallback a1, object a2) и заменить "null" на a1 в BeginInvoke.

    //Вариант-2.
    TextBox1.Text += await new TaskFactory().FromAsync((Func<AsyncCallback, object, IAsyncResult>)delegate (AsyncCallback a1, object a2) { return DownloadTest.BeginInvoke(a1, null); }, (iasr) => DownloadTest.EndInvoke(iasr), null);

    //Вариант-3.
    TextBox1.Text += await new TaskFactory().FromAsync((a1,a2)=> DownloadTest.BeginInvoke(a1, null), (iasr) => DownloadTest.EndInvoke(iasr), null);



    • Изменено Y_VS 18 декабря 2020 г. 22:04
    18 декабря 2020 г. 21:58