Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何取消RestSharp同步执行()调用?_C#_Multithreading_Mono_Restsharp - Fatal编程技术网

C# 如何取消RestSharp同步执行()调用?

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

我有一行代码,它执行阻塞(同步)web服务调用,工作正常:

var response = client.Execute<DataRequestResponse>(request);
最后一行拒绝编译,告诉我它不能进行隐式转换。所以我尝试了一个明确的演员阵容:

IRestResponse<DataRequestResponse> response = task.Result as IRestResponse<DataRequestResponse>;
IRestResponse response=任务。结果为IRestResponse;
编译、运行但随后崩溃(抛出NullReferenceException,表示“对象引用未设置为对象的实例”)

(顺便说一句,一旦我完成了这项工作,那么
cancellationTokenSource.Token
当然会从主线程传入,我还将添加一些代码来检测何时发生中止:我将抛出异常。)

我的备份计划只是中止正在运行的整个线程。原油,但目前这已经足够好了。但如果可以的话,我宁愿做得“恰当”

更多信息:

sync
Execute
调用在这里:它在这里调用
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;