14

何か基本的なものが欠けているように感じます。これが私の問題です。

System.Threading.Tasks.Task インスタンスを作成して、特定の型のパラメーターを受け入れるアクションを実行しようとしています。私は次のようなことができると思った

void DoWork(MyClass obj) {} //My action that accepts a parameter of type 'MyClass'

MyClass obj = new MyClass(); 
Action<MyClass> action = DoWork; //action that points to the method
Task task = new Task(action,obj); //task that would execute 'DoWork' with 'obj' as the parameter when I call Start.

明らかに、これはコンパイルされません。Action<object>タスクには an ではなく anしか使用できずAction<T>、メソッド内で「オブジェクト」を T にキャストできるようです。

どうすれば最も効果的かつ効率的に欲しいものを達成できますか?

4

2 に答える 2

9

直接使用することもできます:

MyClass obj = new MyClass();
Task task = Task.Run(() => DoWork(obj));
于 2012-10-24T10:26:28.183 に答える
6

あなたが使用することができます

Action<Object> action = o => DoWork((MyClass)o);
Task task = new Task(action, obj);

.NET 4.0 以降を使用している場合は、Contravarianceを使用して、新しいデリゲートを導入せずに目標を達成できます。

//不正なコード、実行時に InvalidCastException をキャスト
アクション アクション = DoWork;
タスク task = new Task((Action)action, obj);

編集:

2番目のオプションが正しくないことを指摘してくれた@svickに感謝します。アクションが共変であるか反変であるかを整理するのに忙しすぎました(実際には反変であり、少なくともこれについては正しかったです)。この場合、共分散が必要になります。

反変性は、あなたができることを意味します

Action<object> action1 = someAction;
Action<SubClass> action2 = action1;

明示的なキャストなし。

于 2012-10-24T09:23:21.297 に答える