C#等待DLL异步方法完成

时间:2016-10-26 11:51:34

标签: c# multithreading dll task

我有一个具有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外部等待?

4 个答案:

答案 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;然后得到结果。这将等到方法执行完毕。