namespace Tpl;

class Program
{
    static async Task Main()
    {
        var w = new HttpClient();
        string url = "https://endjin.com/";
        Task<string> webGetTask = w.GetStringAsync(url);

        string pageContent = await webGetTask;

#pragma warning disable CS4014 // Ten przykład nie używa zwróconego zadania, jednak kompilatorowi nie podoba się robienie czegoś takiego w metodzie asynchronicznej. Zazwyczaj w metodach asynchronicznych jedynie oczekujemy, a nie używamy ContinueWith

        webGetTask.ContinueWith(t =>
        {
            string webContent = t.Result;
            Console.WriteLine("Długość strony WWW wynosi: " + webContent.Length);
        });
#pragma warning restore CS4014
    }

    private static void ShowContinuations()
    {
        Task op = Task.Run(DoSomething);
        var cs = new CancellationTokenSource();
        Task onDone = op.ContinueWith(
            _ => Console.WriteLine("To nigdy nie zostanie wykonane"),
            cs.Token);
        Task andAnotherThing = onDone.ContinueWith(
            _ => Console.WriteLine("Kontynuacja kontynuacji"));
        cs.Cancel();
    }

    static void DoSomething()
    {
        Thread.Sleep(1000);
        Console.WriteLine("Zakończono zadanie początkowe");
    }
}

// Ten przykład ma jedynie charakter ilustracyjny i nie musi dać się go skompilować, dlatego jest zapisany w bloku #if false
#if false
public virtual IAsyncResult BeginWrite(byte[] buffer, int offset, int count,
    AsyncCallback callback, object state) ...
public virtual void EndWrite(IAsyncResult asyncResult) ...

public abstract void Write(byte[] buffer, int offset, int count) ...
#endif
