从System.Threading.Tasks.Task <string>类型的方法写入返回值

时间:2018-08-06 16:09:56

标签: c# .net visual-studio-2017

我正在尝试从已添加到简单c#控制台应用程序的连接服务中获取信息。

这是我在Visual Studio中运行的内容:

class Program
{
    static void Main(string[] args)
    {
        IAuth iAuth = new AuthClient();
        Console.WriteLine("\nYour server version:\n ");

        string result = iAuth.GetServerVersionAsync().ToString();

        Console.WriteLine(result);
        Console.Write("\nPress any key to continue ...");
        Console.ReadKey(true);

    }
}

当我运行它时,没有任何错误,但是我得到的只是这个返回值:

Your server version:

System.Threading.Tasks.Task`1[System.String]

Press any key to continue ...

GetServerVersionAsync()是API的一部分,如下所示:

    public System.Threading.Tasks.Task<string> GetServerVersionAsync()
    {
        return base.Channel.GetServerVersionAsync();
    }

如何获取返回可用值的值?

谢谢!

4 个答案:

答案 0 :(得分:1)

这里的问题是,您永远不会获得任务的结果。为此,您需要await任务,或访问任务的结果。后者将阻塞您的主线程,直到任务完成。

如果您使用的是C#7.1或更高版本,则可以使用async Main(),以便等待任务:

static async Task Main(string[] args)
{
    //some code
    string result = await iAuth.GetServerVersionAsync();
    //Some more code
}

如果您使用的C#版本低于7.1,则可以阻塞线程,直到异步方法完成:

static void Main(string[] args)
{
    //some code
    string result = iAuth.GetServerVersionAsync().Result;
    //Some more code
}

编辑从相等的赞成票和反对票数来看,似乎我没有像我所期望的那样使GetServerVersionAsync()异步。显然,使该方法异步并不能解决问题,但是由于该方法后缀有单词“ Async”,并且它调用了async方法,因此为了清楚起见,使其async似乎是明智的。

答案 1 :(得分:1)

虽然其他答案向您展示了如何进行工作,但正确的解决方案是制造Main async,自2017年以来,C♯7.1可以使用Main static async Task Main(string[] args) // <-- not 'void', but 'async Task' { //Option 1. The best: async Task Main IAuth iAuth = new AuthClient(); Console.WriteLine("\nYour server version:\n"); var version = await iAuth.GetServerVersionAsync(); //<---- key word 'await' Console.WriteLine(version); Console.Write("\nPress any key to continue ..."); Console.ReadKey(true); } (请参见What's new in C# 7.1)。

async

如果得到程序不包含适合入口点的静态“ Main”方法错误,则可能需要在项目属性中设置C the版本。

enter image description here

asyncasync Taks Main世界之间的互动非常棘手,有时非常棘手,应避免。请参阅How to call asynchronous method from synchronous method in C#?


选项2-非异步Main

即使您决定不想要async,我也建议您使用XAsync()的帮助方法。我认为这是一个更好的养成习惯。在此辅助方法的内部,您可以将 static void Main(string[] args) { //Option 1. Not the best: void Main //Mixing async and non-async worlds - avoid if possible. //See https://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous-method-in-c Task t = MyMethodAsync(); t.Wait(); } private static async Task MyMethodAsync() { IAuth iAuth = new AuthClient(); Console.WriteLine("\nYour server version:\n"); string version = await iAuth.GetServerVersionAsync(); //<---- key word 'await' Console.WriteLine(version); Console.Write("\nPress any key to continue ..."); Console.ReadKey(true); } 方法与await关键字一起使用,以达到预期的目的。

这是一个例子。

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
        app.MapWhen(x => !x.Request.Path.Value.StartsWith("/api"), builder =>
        {
            builder.UseMvc(routes =>
            {
                routes.MapSpaFallbackRoute(
                    name: "spa-fallback",
                    defaults: new { controller = "Home", action = "Index" });
            });
        });

答案 2 :(得分:0)

string result = iAuth.GetServerVersionAsync().Result;

然后您可以将其转换为字符串。

var stringResult = result.ToString();

答案 3 :(得分:0)

更改行

string result = iAuth.GetServerVersionAsync().ToString();

string result = iAuth.GetServerVersionAsync().Result;