我有一个具有return Task.Factory.StartNew(() => ...)
方法的DLL,它返回Thread.Sleep(6000)
。我在一个程序中调用它,我希望程序在继续执行其他操作之前等待任务的执行完成。我已经将var invokedTask = myMethod.Invoke(Activator.CreateInstance(myClass), myParams);
添加到DLL中以模拟更长的执行时间。
当我这样称呼它时
var invokedTask = Task.Factory.StartNew(() => myMethod.Invoke(Activator.CreateInstance(myClass), myParams));
invokedTask.Wait();
它继续执行(如预期的那样)。但后来我尝试了这个:
+ '
它不起作用。如何让它从DLL外部等待?
答案 0 :(得分:1)
对于要返回的任务,只需Wait
- 不要再调高另一个 Task
来调用原始方法:
var invokedTask = (Task)myMethod.Invoke(Activator.CreateInstance(myClass), myParams);
invokedTask.Wait();
答案 1 :(得分:0)
我认为调用方法必须在定义中包含async关键字:
async void (or Task) MyCaller()
{
await Task.Factory.StartNew(() => myMethod.Invoke(Activator.CreateInstance(myClass), myParams));
}
void或Task取决于您所处的环境。
答案 2 :(得分:0)
当您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()是一种不好的做法,因为它会阻止当前线程。 因此,我希望您使用等待。
答案 3 :(得分: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转换为任务&lt;&gt;然后得到结果。这将等到方法执行完毕。