partial class Program
{
  static void MethodA()
  {
    TaskTitle("Rozpoczęcie metody A...");
    OutputThreadInfo();
    Thread.Sleep(3000); // Symulacja 3 sekund pracy.
    TaskTitle("Zakończenie metody A.");
  }

  static void MethodB()
  {
    TaskTitle("Rozpoczęcie metody B...");
    OutputThreadInfo();
    Thread.Sleep(2000); // Symulacja 2 sekund pracy.
    TaskTitle("Zakończenie metody B.");
  }

  static void MethodC()
  {
    TaskTitle("Rozpoczęcie metody C...");
    OutputThreadInfo();
    Thread.Sleep(1000); // Symulacja 1 sekundy pracy.
    TaskTitle("Zakończenie metody C.");
  }

  static decimal CallWebService()
  {
    TaskTitle("Wywołanie usługi internetowej...");
    OutputThreadInfo();
    Thread.Sleep((new Random()).Next(2000, 4000));
    TaskTitle("Koniec wywołania usługi internetowej.");
    return 89.99M;
  }

  static string CallStoredProcedure(decimal amount)
  {
    TaskTitle("Wywołanie procedury składowanej...");
    OutputThreadInfo();
    Thread.Sleep((new Random()).Next(2000, 4000));
    TaskTitle("Koniec wywołania procedury składowanej.");
    return $"12 produktów kosztuje więcej niż {amount:C}.";
  }

  static void OuterMethod()
  {
    TaskTitle("Wywołanie metody zewnętrznej...");
    Task innerTask = Task.Factory.StartNew(InnerMethod,
      TaskCreationOptions.AttachedToParent);
    TaskTitle("Koniec metody zewnętrznej.");
  }

  static void InnerMethod()
  {
    TaskTitle("Wywołanie metody wewnętrznej...");
    Thread.Sleep(2000);
    TaskTitle("Koniec metody wewnętrznej.");
  }
}