2016-10-26 21 views
0

public Task<>メソッドを持つDLLがあり、return Task.Factory.StartNew(() => ...)を返します。私はプログラムの中でそれを呼び出すのですが、他のことを続ける前にタスクの実行が終了するのを待ってもらいたいです。 DLLにThread.Sleep(6000)を追加して、より長い実行をシミュレートしました。C#DLL非同期メソッドの終了を待つ

私は(予想通り)それはちょうど、実行を継続し、この

var invokedTask = myMethod.Invoke(Activator.CreateInstance(myClass), myParams); 

のようにそれを呼んでいます。しかし、私はこれを試しました:

var invokedTask = Task.Factory.StartNew(() => myMethod.Invoke(Activator.CreateInstance(myClass), myParams)); 
invokedTask.Wait(); 

それは動作しません。どうすればDLLの外部から待つことができますか?

私は、呼び出し元のメソッドが定義で非同期キーワードを持っている必要があります考えて
+0

2番目の例では、* new * 'Task'を作成しています。あなたがそのタスクを与えている唯一の仕事は、 'myMethod'関数を実行し、それが返すタスクを無視することです。もちろん、「タスク」は完了するまでに時間がかかりません。あなたの最初の例で '' InvokedTask''を '' Wait''と呼んでみませんか? –

+0

すでに試しましたが、 'invokedTask'は' Task'型ではなく 'object'です – Norgul

+1

しかし、実際には' Task'です。あなたが必要とするのは、キャストだけです。より多くの「タスク」を作成することに悩まされるわけではありません。 –

答えて

1

だけWait戻されているタスクのための - だけのオリジナルメソッドを呼び出すためにTaskをスピンアップしません。助けてこの例

var invokedTask = (Task)myMethod.Invoke(Activator.CreateInstance(myClass), myParams); 
invokedTask.Wait(); 
0

async void (or Task) MyCaller() 
{ 
    await Task.Factory.StartNew(() => myMethod.Invoke(Activator.CreateInstance(myClass), myParams)); 

} 

ボイドやタスクは実行しているどの文脈に依存

0

あなたwait()Task.Factory.StartNew()結果がTaskあるとき。 したがって、wait()を2回呼び出すか、await演算子を使用する必要があります。

したがって、次の操作を行うことができます。

var invokedTask = Task.Factory.StartNew(() => myMethod.Invoke(Activator.CreateInstance(myClass), myParams)); 
var result=await await invokedTask; 

またはあなたが行うことができます

var invokedTask = Task.Factory.StartNew(() => myMethod.Invoke(Activator.CreateInstance(myClass), myParams)); 
invokedTask.Wait(); 
var resultTask=invokedTask.Result; 
resultTask.Wait(); 
var result=resultTask.Result; 

は、しかし、あなたが投稿した質問から、それはあなたのmyMethod.Invoke()戻りTask.Factor.StartNew()のように見え、次ので、私はあなたがしかし

var result =await await myMethod.Invoke(Activator.CreateInstance(myClass), myParams); 

を試してみたいですWait()とResult()を使用して現在のスレッドをブロックするのは悪い習慣です。 したがって、私はあなたに待ってもらいたいです。

0

を:

public class MagicClass 
{ 
    private int magicBaseValue; 

    public MagicClass() 
    { 
     magicBaseValue = 9; 
    } 

    public Task<int> ItsMagic(int preMagic) 
    { 
     return Task.Factory.StartNew(() => preMagic * magicBaseValue); 
    } 
} 

public class TestMethodInfo 
{ 
    public static void Main() 
    { 
     // Get the ItsMagic method and invoke with a parameter value of 100 
     Type magicType = typeof(MagicClass); 
     MethodInfo magicMethod = magicType.GetMethod("ItsMagic"); 
     var magicValue = ((Task<int>)(magicMethod.Invoke(Activator.CreateInstance(typeof(MagicClass)), new object[] { 100 }))).Result; 

     Console.WriteLine("MethodInfo.Invoke() Example\n"); 
     Console.WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue.ToString()); 

     Console.ReadKey(); 
    } 
} 

ますInvokeをタスク<>としてキャストし、結果を得ることができます。メソッドの実行が完了するまで待機します。

関連する問題