2016-09-07 5 views
0

新しいタスククラスを使用したいと思っています(年前、BackgroundWorkerを使用していました)。謝罪、私は錆びたんだ...いくつかの理にかなって入力パラメータと結果でのタスクの使用

internal bool DoThisThing(string input) {...} // Takes a while. 

private void toggleButton_Click(object sender, RoutedEventArgs e) 
{ 
    string toggleButtonName = "hi!"; 

    Func<string, bool> delToUse = new Func<string, bool>(DoThisThing); // Delgate of appropriate type 

    Task<bool> task = new Task<bool>(delToUse); // Doesn't like this. Something I can do instead? 

    ... // do other things for a while 

    // Task takes a while, don't want to block UI thread, use Task. 
    task.Start(toggleButtonName); // Looks like Start method doesn't allow input parameters for the assigned delegate like this. How can I accomplish something similar? 

    ... keep on going and let Task finish. Maybe check the result, maybe not.   
} 

うまくいけば?

検索で見たことから、ラムダ式が最も頻繁に使用されるようです。私はそれらをあまり使っていませんでしたので、私は同じことを達成するためのより冗長な方法を(最初に)見つけようとしていました。

ありがとうございます!

答えて

1

最良のオプションは、次のようにラムダ式を使用している:

string toggleButtonName = "hi!"; 
Task<bool> task = Task.Run(() => delToUse(toggleButtonName)); 

しかし、ループでそうしばらくことについて注意してください。使用している変数が、ループを実行したときに初期化されていない場合、タスクが実行されたときに意図しない結果が生じる可能性があります。問題を回避するため、そのようなループ内で変数を再初期化するには:最初の例で

for(int i = 0; i < 10; i++) 
{ 
    // Don't do this!!!! 
    Task<int> task = Task.Run(() => doStuff(i)); 

    // Do this!!! 
    string j = i; 
    Task<int> task = Task.Run(() => doStuff(j)); 
} 

doStuff()はそれは、タスクが実行されたときに、それはあなたがTask.Run()呼び出されたときに、ATの値ではありませんどのような値にiを解決します。現在のスコープで作成された変数に値をコピーすると、この問題が解決されます。これは、2番目の例で行ったことです。 (明らかに、これは参照オブジェクトに対して同じように機能しません)

Resharperがインストールされている場合は、実際に表示されている場合、警告が表示されます。

0

検索で見たことから、ラムダ式が最も頻繁に使用されるようです。私はそれらをあまり使っていませんでしたので、私は同じことを達成するためのより冗長な方法を(最初に)見つけようとしていました。

ラムダを使用してください!しかし、ねえ、あなたがしたくない場合は、ちょうど古くから退屈な方法を使用して);

// :) 
internal bool DoThisThing_ShouldBeALambda() { 
    string toggleButtonName = "hi!"; 
    return DoThisThing(toggleButtonName); 
} 

internal bool DoThisThing(string input) {...} // Takes a while. 

private void toggleButton_Click(object sender, RoutedEventArgs e) 
{ 
    Task<bool> task = new Task<bool>(DoThisThing_ShouldBeALambda); 

    // ... do other things for a while 

    // Task takes a while, don't want to block UI thread, use Task. 
    task.Start(); 

    // ... keep on going and let Task finish. Maybe check the result, maybe not.   
} 
+0

運がいいですか?ラムダ式ではなくメソッドを使うのはあなたには良いようですか? –

関連する問題