所以这是我要做的事情的基础...... 我创建了一个具有Web API 2的网站,因此我可以对该网站进行crud操作。
我正在尝试在VS 2013中创建客户端应用程序。我已经创建了一个基本的控制台应用程序来启动项目。
class PortalReposotry
{
private Uri _uri;
public PortalReposotry()
{
_uri = new Uri("http://localhost:21564/");
}
public async Task<CompanyAPI> GetCompany(string companyCode)
{
var client = new HttpClient();
client.BaseAddress = _uri;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync(String.Format("api/companies/{0}", companyCode));
CompanyAPI content = await response.Content.ReadAsAsync<CompanyAPI>();
return await Task.Run(() => content);
}
}
class Program
{
static void Main(string[] args)
{
PortalReposotry repo = new PortalReposotry();
CompanyAPI comp = repo.GetCompany("LNCR");
Console.ReadKey();
}
}
我不知道为什么我必须使用lamda表达式来返回CompanyAPI对象。
我希望在CompanyAPI对象中返回所有内容而不是它正在运行的任务。我对线程非常困惑,为什么我必须在任务下运行它...它使得我必须将所有内容包装成一个任务....我说实话我不知道如何使用或从我想要的实际物体中扣除它。
如果你可以帮助我,我可能会走错路,但这是我到目前为止所发现的。
答案 0 :(得分:3)
我对线程非常困惑,为什么我必须在任务
下运行它
您不必在此处使用线程(不需要Task.Run
)。 Task<T>
类型是“未来” - 它表示将来 将的结果值类型为T
的异步操作。这就是为什么你需要使用异步代码的任务(从技术上讲,你可以使用回调,但这更痛苦 - 任务更容易)。
我已经创建了一个基本的控制台应用程序来启动项目。
异步控制台应用程序有点奇怪。您需要阻止主线程,以便应用程序不会退出。这在真正的UI客户端应用程序中是不必要的(我假设您的示例项目最终会成为)。所以现在你可以像这样做一个黑客:
static void Main(string[] args)
{
MainAsync().Wait();
}
static async Task MainAsync()
{
PortalReposotry repo = new PortalReposotry();
CompanyAPI comp = await repo.GetCompanyAsync("LNCR");
Console.ReadKey();
}
对Wait()
的调用只能在控制台应用的Main
方法中完成。您不应该在UI应用程序中调用它。
由于不需要Task.Run
,您也可以清理该方法:
public async Task<CompanyAPI> GetCompanyAsync(string companyCode)
{
var client = new HttpClient();
client.BaseAddress = _uri;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync(String.Format("api/companies/{0}", companyCode));
return await response.Content.ReadAsAsync<CompanyAPI>();
}
答案 1 :(得分:0)
public async Task<CompanyAPI> GetCompany(string companyCode)
{
var client = new HttpClient();
client.BaseAddress = _uri;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync(String.Format("api/companies/{0}", companyCode));
CompanyAPI content = await response.Content.ReadAsAsync<CompanyAPI>();
return content
}
然后在你的主要方法中,你可以这样称呼它。免责声明 这将使它同步运行。您可以使用Task对象的ContinueWith方法添加&#34;回调&#34;完成任务。 https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.continuewith(v=vs.110).aspx
CompanyAPI comp = repo.GetCompany("LNCR").Result;