【发布时间】:2013-01-06 09:40:35
【问题描述】:
在我的 win8 (winrt, c#) 应用程序中,我需要调用一个 Web API,它有一个非常具体的限制:不再每 2 秒调用一次 Web 服务。
我已尝试强制执行此限制,如下所示:
class Client
{
const int Delay = 2000;
HttpClient m_client = new HttpClient();
int m_ticks = 0;
public async Task<string> Get(string url)
{
// Multiple threads could be calling, I need to protect access to m_ticks:
string result = null;
lock (this)
{
int ticks = Environment.TickCount - m_ticks;
if (ticks < Delay)
await Task.Delay(Delay - ticks);
result = await m_client.GetStringAsync(url);
m_ticks = Environment.TickCount;
}
return result;
}
}
这让我陷入了困境:
- 我不能在锁中使用 await 语句。
- 我不能回退到 WebClient + Thread.Sleep 之类的东西(避免异步废话),因为它在 win8 客户端配置文件中不存在。
- 我无法避免这种方法是“异步”的,因为这样我就无法等待 GetStringAsync 或 Task.Delay 而不处于异步函数中。
- 我无法避免锁定,因为可能有多个线程调用此函数,并且我需要同步访问 m_ticks。
我该怎么写这样的东西?
【问题讨论】:
标签: c# asynchronous windows-runtime httpclient async-await