我实施我的应用程序,即使用异步JSON-RPC协议的网络层。
为了与服务器通信,我想提出,将发送一个适当的请求,等待服务器响应发送,并返回它的方法。 在使用异步的一切/等待关键字。
下面是简单的示例代码:
串响应;
Task<string> SendRequest(string methodName, string methodParams)
{
string request = generateRequest(methodName, methodParams);
await Send(request); // this will send using DataWriter, and StreamSocket
// block Task until response arrives
return response;
}
async void ReceiveLoop()
{
while (true)
{
uint numStrBytes = await _reader.LoadAsync(BufferSize);
string msg = _reader.ReadString(numStrBytes);
response = msg;
// unblock previously blocked SendRequest
}
}
}
async void main()
{
RecieveLoop();
}
async void SendButtonPressed()
{
string response = await SendRequest("Test method", "Test params");
Debug.WriteLine("Response = " + response);
}
存在的主要问题与该图形这个阻击战。 这个动作应该阻止当前的任务,并允许处理超时。 我试着使用的ManualResetEvent和了WaitOne(int)以处理这个问题,但它冻结整个主题,因为我使用异步/只等待着,它冻结整个应用程序(UI线程我更精确)。
该解决方案,看起来相当哈克对我来说,我可以用Task.Delay与CancellationTokens。
它看起来像这样:
...
CancellationTokenSource cts;
int timeout = 10000;
Task<string> SendRequest(string methodName, string methodParams)
{
... (prepare request, and send)
cts = new CancellationTokenSource();
try
{
await Task.Delay(timeout, cts.Token);
} catch(TaskCanceledException)
{
}
// do rest
}
async void ReceiveLoop()
{
// init recieve loop, and recieve message
cts.Cancel();
}
用该溶液(除了它看起来像一个黑客)的问题是性能 - 每一个请求有抛出EXCETION,需要处理(在这种情况下跳过)。 这是一个缓慢的,它伤害:)
我怎样才能做到这一点更优雅的方式? 是否有任何其他选项来阻止一个任务?