在C#

时间:2015-10-27 07:26:52

标签: c# async-await task-parallel-library

我是C#的新手,我正在尝试一些例子。我有下面的代码。

public async Task<string> RunSlowOperation()
{
    Console.WriteLine("Running the slow operation on thread id {0}",
                       Thread.CurrentThread.ManagedThreadId);

    await Task.Delay(3000);
    Console.WriteLine("Slow operation about to finish with thread id {0}",
                       Thread.CurrentThread.ManagedThreadId); 

    return "This operation is very slow";
}

在我的main函数中,我使用Task调用此异步方法,但收到错误:

Operation op = new Operation();
Task<string> t = new Task<string>(() => op.RunSlowOperation());

上面显示的错误:

  

无法将lambda表达式转换为'string'类型,因为它不是a   委托类型不能隐式转换类型   'System.Threading.Tasks.Task<string>'到'string'

3 个答案:

答案 0 :(得分:2)

RunSlowOperation返回Task<string>。当您实例化Task时,告诉编译器返回类型是string,它不是,因此编译器会对你大吼大叫。

你有几个选择来实现你想要的。首先是告诉编译器您要返回Task<Task<string>>而不是Task<string>

Task<Task<string>> t = new Task<Task<string>>(() => RunSlowOperation());

另一个,这似乎更像是我实际尝试做的事情,只是在awaitRunSlowOperation

public async Task FooAsync()
{
    string result = await RunSlowOperation();
    Console.WriteLine(result);
}

第三,将使用Task.Run而不是new Task,这是在使用TPL时将工作排队到线程池的推荐方法。 Task.Run知道异步委托并将为您解开内部任务,而无需自己执行,因此编译器允许将其分配给Task<string>

Task<string> x = Task.Run(() => RunSlowOperation());

如果你想异步地等待它:

string t = await Task.Run(() => RunSlowOperation());

答案 1 :(得分:2)

为什么要在主函数中创建新任务?您已经可以等待已创建的Task方法。

只需在您的主要功能中执行此操作:

Operation op = new Operation();
string t = await op.RunSlowOperation();

不要忘记让你的主要功能 async

答案 2 :(得分:1)

您必须等待主要方法。

Operation op = new Operation();
Task<string> t = await op.RunSlowOperation();

但是等待Main中的方法是一种不好的做法,而不是创建像这样的方法

static async void MyMethod()
{
            Operation op = new Operation();
            Task<string> t = await op.RunSlowOperation();
}

然后从Main方法调用此方法。有关详细信息,请参阅 https://msdn.microsoft.com/en-us/library/hh191443.aspx

https://msdn.microsoft.com/en-us/library/hh191443.aspx和 begginer有很好的视频。 https://www.youtube.com/watch?v=iMcycFie-nk