将DownloadString WebClient()单线程调用迁移到异步调用

时间:2011-03-23 23:47:45

标签: c# api asynchronous

我想将一个非常静态的DownloadString()调用转换为DownloadStringAsync(),但无法按照我的意愿获得流量。

目前,我在 lot 的地方执行以下操作:

string apiurl = "http://api.gowalla.com/spots/" + spot;
var entries = JsonConvert.DeserializeObject<SpotInfo>(CallGowalla(apiurl));
return entries;

CallGowalla看起来像这样:

private static string CallGowalla(string apiurl)
        {
            var wc = new WebClient();
            wc.Headers["Accept"] = "application/json";
            wc.Headers["ContentType"] = "application/json";
            wc.Headers["Authorization"] = CreateAuthorizationString();
            wc.Headers["-Gowalla-API-Key"] = ConfigurationManager.AppSettings["api"].ToString();
            var raw = wc.DownloadString(apiurl);
            return raw;
        }

我在通话时遇到了挂机,所以我想将DownloadString移到DownloadStringAsync,我不确定从哪里开始,而不会将所有通话转移到{{1}整个过程。

有什么想法吗?

关于建筑和重构的建议也欢迎......

1 个答案:

答案 0 :(得分:1)

您可能想要考虑如何调用CallGowalla()方法。以异步方式开始调用此方法可能更容易。请查看this Microsoft KB文章中的一些示例。你的CallGowalla()方法相当于那些样本中的LongRunningMethod()。

在某些环境(如ASP.NET)中,异步运行方法(可能使用其他线程)可能会出现问题。研究依赖于您环境的问题非常重要。如果您正在尝试获得更高的吞吐量(更多调用Gowalla),那么您可能希望使用ThreadPool来执行您的方法而无需管理线程。这样做的问题是您可能会很快超出Gowalla API限制。如果您可以提供更多关于为何需要进行这些调用的详细信息,那将是一件好事。

如果您需要使用C#进行线程概述,可以使用free book