15 Eylül 2017 Cuma

Task.Run metodu

Giriş
Açıklaması şöyle
A Task.Run or Task.Factory.StartNew may start executing at any time (e.g. if a thread from the pool is idle), even if nothing is waiting for it.
Action Parametresi - Lambda
Kullanımı çok basit. Şöyle yaparız. Verilen işin thread pool içinde çalışmasını sağlar.
Task.Run(() => {...});
Task.Run altta şöyle bir kod çalıştırıyor.
Task.Factory.StartNew(someAction, 
  CancellationToken.None, 
  TaskCreationOptions.DenyChildAttach,
  TaskScheduler.Default);
Action Parametresi - async metod
Bu kullanımı hiç anlamadım. asenkron metodu senkron haline getiriyor ve yapılmamalı deniliyor. Açıklaması şöyle
You should not hide an asynchronous implementation behind a synchronously running method
Örnek
Şöyle yaparız.
Task.Run(async () => await MyAsyncTask());
ConcurrentBag<int> bag = new ConcurrentBag<int> ();

async Task MyAsyncTask()
{
  await Task.Delay(random.Next(1000));
  bag.Add (random.Next (10));
}
Örnek
Elimizde şöyle bir metod olsun
public async Task<Foo> GetFooAsync();
Senkron hale getirmek için şöyle yaparız
Task.Run(async () => await GetFooAsync());
Döndürülen Nesne Tipi
Task.Run metoduna döndürülen nesne tipini yazamaya gerek yok. Derleyici bizim için belirler. Şöyle yaparız.
Task<string> Foo() 
{
  return Task.Run(()=>
  {
    SomeLongRunningMethod();
    return "Hello";
  });
}
Exception
MSDN örneği şöyle
var myTask = Task.Run(() =>
    {
        throw new Exception("test");
    });
try
{
    myTask.Wait();
}
catch (Exception e)
{
    return false;
}
Run metodu exception fırlatırsa, dışarıdaki kod exception'ı görebilir. Açıklaması şöyle.
task.Wait()  Rethrows any exceptions

task.Result  Rethrows any exceptions


Hiç yorum yok:

Yorum Gönder