在我的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;
}
}
这已经跑我变成了砖墙:
- 在锁我不能使用等待声明。
- 我不能回退到像WebClient + Thread.Sleep(避免异步废话),因为它不存在于win8客户端配置文件。
- 我不能避免这种方法是“异步”,因为然后我不能等待GetStringAsync或Task.Delay而不处于异步函数。
- 我无法避免锁定,因为多个线程可能正在调用此函数,并且我需要对m_ticks进行同步访问。
在这个世界上我该怎么写这样的东西?
不雅,但我认为有效。 – LCC