[英]C# wait DLL async method to finish
我有一個具有public Task<>
方法的DLL,該方法返回return Task.Factory.StartNew(() => ...)
。 我正在程序中調用它,並且我希望程序在繼續執行其他操作之前先等待任務執行完成。 我已將Thread.Sleep(6000)
添加到DLL中以模擬更長的執行時間。
當我這樣稱呼它時
var invokedTask = myMethod.Invoke(Activator.CreateInstance(myClass), myParams);
它只是繼續執行(如預期的那樣)。 但是后來我嘗試了這個:
var invokedTask = Task.Factory.StartNew(() => myMethod.Invoke(Activator.CreateInstance(myClass), myParams));
invokedTask.Wait();
而且它不起作用。 如何讓它從DLL外部等待?
只需Wait
返回的任務-不要啟動另一個 Task
只是為了調用原始方法:
var invokedTask = (Task)myMethod.Invoke(Activator.CreateInstance(myClass), myParams);
invokedTask.Wait();
我認為調用方法的定義中必須具有async關鍵字:
async void (or Task) MyCaller()
{
await Task.Factory.StartNew(() => myMethod.Invoke(Activator.CreateInstance(myClass), myParams));
}
無效或任務取決於您所處的上下文。
當您wait()
Task.Factory.StartNew()
,結果是一個Task
因此,您必須調用兩次wait()
或使用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()是一個不好的做法,因為它會阻塞當前線程。 因此,我希望您使用await。
該示例可能會有所幫助:
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強制轉換為Task <>,然后獲取結果。 這將等到該方法執行完畢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.