这是在彼此之间投射代表的正确方法吗?

时间:2017-11-08 09:13:09

标签: c# asynchronous

我正在尝试将自定义委托作为Task.Run()的输入,但因为Task.Run()仅接受Action和Func<>作为形式参数,所以我将自定义委托变量更改为正确Func<int>变量,以便我可以将此Func<int>变量提供给我的Task.Run()方法。我使用了转换

        Del mydel = new Del(Get10);
        Func<int> xx = new Func<int>(mydel);
        int p = await Task.Run(xx);  

这是代理人之间的投票是如何完成的,还是有其他常用的方法来做到这一点?

using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace ConsoleApplication25
{
class Program
{
    public delegate int Del();

    public static int Get10()
    {
        return 10;
    }

    public async Task DoAsync()
    {
        Del mydel = new Del(Get10);
        Func<int> xx = new Func<int>(mydel);
        int p = await Task.Run(xx);  

        Console.WriteLine("{0}", p);
    }

    static void Main(string[] args)
    {
        Task t = new Program().DoAsync();
        t.Wait();
    }
}
}

1 个答案:

答案 0 :(得分:1)

代理之间的转换,您只是使用Delegate对象作为对具有匹配签名的Func委托的引用,而正在发生的是Func委托而不是调用方法正在调用委托在内部调用一个方法,所以一个额外的级别间接,没有这样的目的实现。当你可以实际引用主引用/指针

时,它就像一个指向指针的指针

查看以下代码:

您的版本

Del mydel = new Del(Get10);
Func<int> xx = new Func<int>(mydel);

以下也可以

Func<int> xx = new Func<int>(Get10);

Func<int> xx = Get10;

你要求的是(施法):

Func<int> xx = (Func<int>) mydel;

哪个不起作用,因为Func委托与其他自定义委托之间没有类型兼容性