2016-04-07 11 views
0

タスクの2つのメソッドを作成する必要があります。それぞれ、ContinueWith()と似ていますが、メインUIスレッドでcontunuationを実行します。パラメータActionアクション<Task>の実装

過法、Action<Task>

方法(アクションにオーバーロードするための)タスクを返します。返されたタスクは、メインタスクと継続 が完了した後で終了する必要があります。

Actionと正しく実装されていますか?そして、どのようにReturned task must finish only after main Task and continuation

Action<Task> inputを有する第二ケースを実装する私は

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

基本的な「await」のように見えます。十分なはずです...なぜこのような複雑な共同de? –

+0

2番目のメソッドでは、 'public Task Work(Action input、TaskScheduler uiSchedule)'の署名が間違っていると思います。 'public Task Work(Task current、Action input、TaskScheduler uiSchedule)' 。そうでなければ、不可能な再帰的な仕事をしているように見えます。 – Enigmativity

+0

@AlexeiLevenkov、それはアクションで実装するタスクです。 – A191919

答えて

3

を実装要件は、右の音はありません。

Actionの非同期の相手はAction<Task>ではありません - Func<Task>です。上記の文をサポートするためのフレームワークには、Task.Runというメソッドが多数あります。

同様に、Action<T>の場合、非同期バージョンはFunc<T, Task>です。 Action<T1, T2>についてはFunc<T1, T2, Task>です。あなたはその考えを得る。

だから、それは心の中であなたの実装では、今となって:あなたは、今でもWork(Func<Task>, TaskScheduler)の面で他の方法を表現することができ

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

    SomeSynchronousCpuBoundWork(result); 
}, 
uiScheduler); 

:このような通話を可能にする

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); 
} 
関連する問題