在我的 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。
我到底要怎么写这样的东西?