我正在尝试从已添加到简单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();
}
如何获取返回可用值的值?
谢谢!
答案 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版本。
非async
和async 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;