Hirdetés

Keresés

Új hozzászólás Aktív témák

  • joysefke

    veterán

    válasz Froclee #8758 üzenetére

    Az async void-dal egy csomó helyen meg van kötve az ember keze.

    Event handlerek tipikusan void implementációt akarnak, ott csak az async void jöhet szóba.

    Most egy xamarin projekt van előttem megnyitva:

    tipikus event handler:

    private async void Trending_Clicked(object sender, EventArgs e)
    {
    await Navigation.PushAsync(new TrendingPage());
    }

    Ez meg egy lifecycle override az ősosztályon, csak async void-ot fogad el
    protected override async void OnAppearing()
    {
    base.OnAppearing();
    await something(...)
    }

    szóval én kerülöm ezt az async void dolgot mint a pestist a saját metódusaimban, de amikor az interfész rákényszerít, akkor mit tudnék mást tenni?

  • joysefke

    veterán

    válasz Froclee #8758 üzenetére

    Azt elfogadom, hogy az async void Dispose() nem működik úgy ahogyan én azt elvárnám :)

    A compiler az IDisposable interfészre -és úgy általában minden void visszatérésű metódusra- figyelmeztetés nélkül elfogad egy async void implementációt.

    Ez fordul és fut (C# 7.1+):

    using System;
    using System.Threading.Tasks;

    public interface iface
    {void func1(int delay);
    Task func2(int delay);}

    class Program : iface
    {
    static async Task Main(string[] args)
    {
    Program p = new Program();

    Console.WriteLine($"starting {nameof(p.func1)}");
    p.func1(3500);
    Console.WriteLine($"{nameof(p.func1)} started");

    Console.WriteLine($"starting and awaiting {nameof(p.func2)}");
    await p.func2(2000);


    await Task.Delay(3500-2000 + 500);
    }

    public async void func1(int delay)
    {await Task.Delay(delay);
    Console.WriteLine($"Hello from {nameof(func1)}");}

    public async Task func2(int delay)
    {await Task.Delay(delay);
    Console.WriteLine($"Hello from {nameof(func2)}");}
    }

    A p.func1() hívás nem await-elhető, de működik raja az async keyword, a func1 implementációján belül a compiler kulcsszóvá alakítja az await-et és a func1-en belül awaithelhetőek lesznek az async metódusok. A példában a func1 törzsében a végrehajtás előbb bevárja a Task.Delay()-t és csak aztán ír a konzolra.

    Szóval ez az async void dolog minden hibájával együtt nagyjából működik.

    Ezért nem értem, hogy az xUnit-ban egy async void Dispose hívásban a végrehajtás a Dispose metódus törzsében miért hagyja figyelmen kívül az await kulcsszót, elindítja a Task-ot amit kiadtam neki, de nem várja be :F .. .

Új hozzászólás Aktív témák