2016-04-07 14 views
0

Görev için iki yöntem oluşturmam gerekiyor, her biri ContinueWith() ile benzer olacak, ancak ana UI iş parçacığında contunuation gerçekleştirecek. parametrelerle Action ileEylem <Task> uygulama

Aşırı yük yöntemi, Action<Task>

Yöntemi (Eylem ile aşırı için) Görev döndürür. İade edilen görev, ana Görev ve devam tamamlandıktan sonra bitmelidir.

Action ile doğru uygulama işlevi var mı? Ve nasıl Returned task must finish only after main Task and continuation

ile Action<Task> input ile ikinci durumda uygulamaya Ben

namespace WpfApplication2 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
     WorkAsync WA = new WorkAsync(); 
     Action firstaction = new Action(WA.Count); 
     WA.Work(firstaction, uiScheduler); 

     Action<Task> secondaction = new Action<Task>(); //What should be here? 
     WA.Work(secondaction, uiScheduler); 
    } 
    public class WorkAsync 
    { 
     public Task Work(Action input, TaskScheduler uiSchedule) 
     { 
      return Task.Factory.StartNew(input).ContinueWith((e) => { Console.WriteLine("Done"); }, uiSchedule); 
     } 
     public Task Work(Action<Task> input, TaskScheduler uiSchedule) 
     { 
      /// What should be here? 
     } 

     public void Count() 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       System.Threading.Thread.Sleep(1000); 
       Console.WriteLine(i); 
      } 
     } 
    } 
} 

}

+0

Basit 'bekliyor' yeterli gibi görünüyor ... Yeterince neden böyle karmaşık bir coca ihtiyacınız var de? –

+0

İkinci yönteme ait imzanızın yanlış olduğunu düşünüyorum - 'public Task Work (Eylem input, TaskScheduler uiSchedule)' - bana göre, “public Task Work (Görev Akışı, Action input, TaskScheduler uiSchedule)” olmalıdır. . Aksi halde, bir çeşit imkansız yinelemeli görev yaptığınız anlaşılıyor. – Enigmativity

+0

@AlexeiLevenkov, Action ile uygulanması görevidir. – A191919

cevap

3

Talepleriniz doğru ses yok uygulanmaktadır.

Action'un eşzamansız karşılığı Action<Task> değil - Func<Task>. Çerçevede yukarıdaki ifademi destekleyen bir takım yöntemler var: Task.Run bir.

Benzer şekilde, Action<T> için async sürümü Func<T, Task>'dur. Action<T1, T2> için Func<T1, T2, Task>'dur. Kaptın bu işi.

Yani, akılda uygulamanız şimdi olur ile: Artık hatta Work(Func<Task>, TaskScheduler) açısından diğer yöntem ifade edebilir

Task myCustomTaskFollowedByConsoleWriteLine = Work(async() => 
{ 
    object result = await SomeIOWorkAsync(); 

    SomeSynchronousCpuBoundWork(result); 
}, 
uiScheduler); 

: Böyle aramalar için izin verecektir

public Task Work(Func<Task> input, TaskScheduler uiScheduler) 
{ 
    return input().ContinueWith(e => Console.WriteLine("Done"), uiScheduler); 
} 

:

public Task Work(Action input, TaskScheduler uiScheduler) 
{ 
    return Work(() => Task.Run(input), uiScheduler); 
} 
İlgili konular