クロージャは、囲まれた変数の値ではなく、参照に近いことを理解しています。それは私の質問ではありません。「このタスクに、実行時ではなく、作成時に表示されるこの値を与える」ことを(コンパイラーに)表現する方法を知りたいです。
言い換えれば、どうすれば取得できますか
static void Main(string[] args)
{
var userName = "Alice";
var task = new Task(() =>
{
Console.WriteLine("User is: " + userName);
});
// continues work ...
userName = "Zoltan";
task.Start();
Console.ReadLine();
}
印刷する
User is: Alice
それが今していることの代わりに、すなわち
User is: Zoltan
避けようとしている
Task.Factory.StartNew((copy) =>
{
Console.WriteLine("User is: " + (string)copy);
}, userName);
これにより、すべての状態オブジェクト(userNameなど)を実際のラムダ内の対応する型に再キャストする必要があります。これは、StartNew
メソッドインターフェイスobject
がジェネリックインターフェイス(例:)ではなく型のオブジェクトを定義しているため<T>
です。上記のデモの例は、文字列と1つの書き込み行で問題ないように見えますが、大きなオブジェクトを使用して画面一杯のコード全体に再キャストする実際の状況では、少し無駄があります(エラーが発生しやすくなります)。