Как сделать события формы, чтобы использовать преимущества от асинхронного? - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть простая Форма с кнопкой и одним событием button1_Click:

public Form1 : Form
{
    public Form1()
    {
        ...
        this.button1.Click += new System.EventHandler(this.button1_Click);
    }

    private async Task button1_Click(object sender, EventArgs e) // line A
    {
    }
}

В строке A я хотел бы попробовать использовать тип возврата async Task, а не void, и я получаю сообщение об ошибке от компилятора. Как я могу заставить этот код работать?

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Я думаю, что следующее предложение приятно и функционально. Однако иногда это происходит в режиме DevExpress Design. Таким образом, я поставил свое решение для дальнейшего обсуждения:

public Form1 : Form
{
    public Form1()
    {
        ...
        this.button1.Click += 
             new System.EventHandler(
                 async (sender, events) => await this.button1_Click(sender, events)
             );
    }

    private async Task button1_Click(object sender, EventArgs e) // line A
    {
    }
}
0 голосов
/ 09 ноября 2018

Как я могу заставить этот код работать?

Это невозможно сделать, поскольку подпись async Task не реализована для обработчиков событий пользовательского интерфейса в .net. (обязательно прочитайте этот пост: Почему обработчики событий всегда имеют возвращаемый тип void? )

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

Конечно, вы можете преодолеть проблему, поместив логику событий в другой класс. В любом случае, в большинстве случаев это действительно хорошая идея.

Примечание: не используйте это так, это просто для объяснения

public Form1 : Form
{
    public Form1()
    {
        ...
        this.button1.Click += new System.EventHandler(this.button1_Click);
    }

    private async void button1_Click(object sender, EventArgs e) // line A
    {
        await YourLogic(e.foo); //optional configure await.
    }

    private async Task YourLogic(your parameters)
    {
        // do stuff
    }
}

Смотри также:

Почему обработчики событий всегда имеют тип возврата void?

async / await - когда вернуть задание void void?

https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

Как мне ждать событий в C #?

<Ч />

Как сделать так, чтобы события формы использовали преимущества асинхронности?

Итак, в основном это уже происходит, но посмотрите этот пост: Как «ожидать» вызова события EventHandler

0 голосов
/ 09 ноября 2018

Мы можем проверить этот код:

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.button1.Click += (s, e) => Button1_Click(s, e);
        //this.button1.Click += Button1_Click1;
        MessageBox.Show("The End!");
    }
    private async Task Button1_Click(object sender, EventArgs e)
    {
        await Task.Delay(5000);
        MessageBox.Show("With Sync");
    }

    private void Button1_Click1(object sender, EventArgs e)
    {
        MessageBox.Show("Without async");
    }
}
0 голосов
/ 09 ноября 2018

Этот обработчик событий является делегатом с void типом возврата, что означает, что вы не можете добавить методы с Task результатом.

Однако вы также можете пометить void методы с помощью async, поэтому вы должны просто заменить Task на void.

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