我正在尝试将自定义委托作为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();
}
}
}
答案 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
委托与其他自定义委托之间没有类型兼容性