簡體   English   中英

C#等待DLL異步方法完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM