Action with Action委托接受字符串参数

时间:2016-11-25 10:17:21

标签: c# task-parallel-library delegates

我刚开始使用并行编程。我想创建一个在控制台上打印消息的动作委托方法。当我将Action<string>更改为Action<object>PritMessage参数以反对其工作时,但“string编译器会抛出错误。

  

最佳重载方法匹配   'System.Threading.Tasks.Task.Task(System.Action,object)'。
  参数1:无法从'System.Action&lt; string&gt;'转换至   'System.Action&LT;对象&gt;'

static void Main(string[] args)
{
    string message = "test";
    Action<string> print = PrintMessage;
    Task task = new Task(print, message); 
    task.Start();
    Console.ReadKey();
}

static void PrintMessage(string message)
{
    Console.WriteLine(message);
}

1 个答案:

答案 0 :(得分:1)

如果您检查Task constructors,则会发现您无法使用Action创建一个除了没有参数或单个object参数之外的任务。

对于此特定示例,您只需使用lambda运行Task,如下所示:

Task.Run(() =>
{
    PrintMessage(message);
}

然而,更好的方法是更改​​签名并转换参数:

static void Main(string[] args)
{
    var message = "test";
    Task task = new Task(PrintMessage, message); 
    task.Start();
    Console.ReadKey();
}

static void PrintMessage(object messageObj)
{
    var message = messageObj as string;
    Console.WriteLine(message);
}

或者只是在Console中打印对象:

static void PrintMessage(object message)
{
    Console.WriteLine(message);
}