【发布时间】:2015-05-26 09:25:01
【问题描述】:
我有这条线,它执行阻塞(同步)网络服务调用,并且工作正常:
var response = client.Execute<DataRequestResponse>(request);
(var代表IRestResponse<DataRequestResponse>)
但是,现在我希望能够取消它(从另一个线程)。 (我找到了这个similar question,但我的代码必须保持同步——代码更改必须在这个函数中保持本地化。)
我找到了CancellationTokenSource,还有一个ExecuteTaskAsync(),它需要一个CancellationToken。 (请参阅https://stackoverflow.com/a/21779724/841830)听起来它可以完成这项工作。我得到了这段代码:
var cancellationTokenSource = new CancellationTokenSource();
var task = client.ExecuteTaskAsync(request, cancellationTokenSource.Token);
task.Wait();
var response = task.Result;
最后一行拒绝编译,告诉我它不能进行隐式转换。所以我尝试了一个明确的演员:
IRestResponse<DataRequestResponse> response = task.Result as IRestResponse<DataRequestResponse>;
编译、运行,但随后崩溃(抛出 NullReferenceException,说“对象引用未设置为对象的实例”)。
(顺便说一句,一旦我有这个工作,那么cancellationTokenSource.Token当然会从主线程传入,我还将添加一些代码来检测何时发生中止:我会抛出一个异常.)
我的备用计划只是中止正在运行的整个线程。粗略,但目前这实际上已经足够了。但如果可以的话,我宁愿“正确地”做。
更多信息:
同步 Execute 调用在此处:https://github.com/restsharp/RestSharp/blob/master/RestSharp/RestClient.Sync.cs#L55 最终调用 Http.AsGet() 或 Http.AsPost(),然后在此处结束:https://github.com/restsharp/RestSharp/blob/master/RestSharp/Http.Sync.cs#L194
换句话说,RestSharp 在幕后使用的是HttpWebRequest.GetResponse。它有一个Abort 函数,但作为一个同步函数(即在请求完成之前不会返回)对我来说用处不大!
【问题讨论】:
标签: c# multithreading mono restsharp