C# 如何取消RestSharp同步执行()调用?
我有一行代码,它执行阻塞(同步)web服务调用,工作正常:C# 如何取消RestSharp同步执行()调用?,c#,multithreading,mono,restsharp,C#,Multithreading,Mono,Restsharp,我有一行代码,它执行阻塞(同步)web服务调用,工作正常: var response = client.Execute<DataRequestResponse>(request); 最后一行拒绝编译,告诉我它不能进行隐式转换。所以我尝试了一个明确的演员阵容: IRestResponse<DataRequestResponse> response = task.Result as IRestResponse<DataRequestResponse>; IRe
var response = client.Execute<DataRequestResponse>(request);
最后一行拒绝编译,告诉我它不能进行隐式转换。所以我尝试了一个明确的演员阵容:
IRestResponse<DataRequestResponse> response = task.Result as IRestResponse<DataRequestResponse>;
IRestResponse response=任务。结果为IRestResponse;
编译、运行但随后崩溃(抛出NullReferenceException,表示“对象引用未设置为对象的实例”)
(顺便说一句,一旦我完成了这项工作,那么cancellationTokenSource.Token
当然会从主线程传入,我还将添加一些代码来检测何时发生中止:我将抛出异常。)
我的备份计划只是中止正在运行的整个线程。原油,但目前这已经足够好了。但如果可以的话,我宁愿做得“恰当”
更多信息:
syncExecute
调用在这里:它在这里调用Http.AsGet()
或Http.AsPost()
,然后在这里结束:
换言之,在RestSharp使用的封面下。它有一个Abort
功能,但作为一个同步功能(即,在请求完成之前不会返回),对我没有多大用处 给定此同步调用:
var response = client.Execute<MyData>(request);
process(response);
var response=client.Execute(请求);
过程(响应);
将其更改为:
var response = null;
EventWaitHandle handle = new AutoResetEvent (false);
client.ExecuteAsync<MyData>(request, r => {
response = r;
handle.Set();
});
handle.WaitOne();
process(response);
var响应=null;
EventWaitHandle=new AutoResetEvent(false);
client.ExecuteAsync(请求,r=>{
响应=r;
handle.Set();
});
handle.WaitOne();
过程(响应);
这相当于同步版本,没有任何好处。下面是添加中止功能的一种方法:
bool volatile cancelAllRequests = false;
...
var response = null;
EventWaitHandle handle = new AutoResetEvent (false);
RestRequestAsyncHandle asyncRequest = client.ExecuteAsync<MyData>(request, r => {
response = r;
handle.Set();
});
while(true){
if(handle.WaitOne(250))break; //Returns true if async operation finished
if(cancelAllRequests){
asyncRequest.WebRequest.Abort();
return;
}
}
process(response);
bool volatile cancelAllRequests=false;
...
var响应=null;
EventWaitHandle=new AutoResetEvent(false);
RestrequeStateSynchHandle asyncRequest=client.ExecuteAsync(请求,r=>{
响应=r;
handle.Set();
});
虽然(正确){
if(handle.WaitOne(250))break;//如果异步操作完成,则返回true
如果(取消所有请求){
asyncRequest.WebRequest.Abort();
返回;
}
}
过程(响应);
(对不起,我迫不及待地想让赏金结出果实,所以我必须自己解决这个问题,通过今天下午的反复试验…你电话的异步对应方
var response = client.Execute<DataRequestResponse>(request);
var response=client.Execute(请求);
是RestSharp异步方法
它接受取消令牌,并返回具有正确返回类型签名的任务。要使用它并等待其(可取消)完成,您可以将示例代码更改为:
var cancellationTokenSource = new CancellationTokenSource();
// ...
var task = client.ExecuteTaskAsync<DataRequestResponse>(
request,
cancellationTokenSource.Token);
// this will wait for completion and throw on cancellation.
var response = task.Result;
var cancellationTokenSource=new cancellationTokenSource();
// ...
var task=client.executetask异步(
要求
cancellationTokenSource.Token);
//这将等待完成并引发取消。
var response=task.Result;
谢谢你的回答。上述代码是否需要位于标有async
的函数中?这是我在尝试使用ExecuteTaskAsync
函数时一直遇到的问题之一。@DarrenCook虽然在调用堆栈中一直使用async
通常是个好主意,但您不必这样做。在上面的示例中,您将注意到没有wait
语句,而是使用response=task.Result执行阻塞等待代码>。因此,包含此代码的方法不应标记为async
。或者,您可以将其设置为async Task MyMethod(…){…return await Task;}
,并让调用MyMethod
的客户端代码进行等待(阻塞或使用await
)。
var cancellationTokenSource = new CancellationTokenSource();
// ...
var task = client.ExecuteTaskAsync<DataRequestResponse>(
request,
cancellationTokenSource.Token);
// this will wait for completion and throw on cancellation.
var response = task.Result;