Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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# 带有令牌的TaskCompletionSource_C#_Multithreading - Fatal编程技术网

C# 带有令牌的TaskCompletionSource

C# 带有令牌的TaskCompletionSource,c#,multithreading,C#,Multithreading,我使用Scandit框架创建了扫描方法。因为我使用的是Xamarin.Forms,所以没有等待扫描的选项。Scandit准备了作为扫描结果的回调。我想把它包装成一个方法,可以与waiter一起使用 以下是我所做的: public async Task<Operation<string>> ScanAsync(CancellationToken cancellationToken = default(CancellationToken)) {

我使用Scandit框架创建了扫描方法。因为我使用的是Xamarin.Forms,所以没有等待扫描的选项。Scandit准备了作为扫描结果的回调。我想把它包装成一个方法,可以与waiter一起使用

以下是我所做的:

 public async Task<Operation<string>> ScanAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                _codeScannedTcs = new TaskCompletionSource<Operation<string>>();
                ScanditService.BarcodePicker.DidScan += OnScanFinished;

                await ScanditService.BarcodePicker.StartScanningAsync();

                var result = await Task.WhenAny(_codeScannedTcs.Task);

                return result.Result;
            }
            catch (TaskCanceledException)
            {
                return Operation<string>.FailedOperation("A task was canceled");
            }
            catch (Exception ex)
            {
                return Operation<string>.FailedOperation(ex.Message);
            }
            finally
            {
                _codeScannedTcs = null;
                ScanditService.BarcodePicker.DidScan -= OnScanFinished;
            }

        }
public async Task scanaync(CancellationToken CancellationToken=default(CancellationToken))
{
尝试
{
_codeScannedTcs=新任务完成源();
ScanditService.BarcodePicker.DidScan+=OnScanFinished;
等待ScanditService.BarcodePicker.StartScanningAsync();
var result=wait Task.wheny(_codeScannedTcs.Task);
返回结果。结果;
}
捕获(TaskCanceledException)
{
返回操作。失败操作(“任务被取消”);
}
捕获(例外情况除外)
{
返回操作。失败操作(例如消息);
}
最后
{
_codeScannedTcs=null;
ScanditService.BarcodePicker.DidScan-=OnScanFinished;
}
}

在这种情况下,我如何使用取消令牌随时中断扫描?

我过去使用过以下代码:

        /// <summary>
    /// Allows the code waiting for an async operation to stop waiting when the cancellation token is set.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="task"></param>
    /// <param name="cancellationToken"></param>
    /// <see cref="https://blogs.msdn.microsoft.com/pfxteam/2012/10/05/how-do-i-cancel-non-cancelable-async-operations/"/>
    /// <returns></returns>
    public static async Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken)
    {
        var tcs = new TaskCompletionSource<bool>();

        using (cancellationToken.Register(x => ((TaskCompletionSource<bool>)x).TrySetResult(true), tcs))
        {
            if (task != await Task.WhenAny(task, tcs.Task))
                throw new OperationCanceledException(cancellationToken);
        }

        return await task;
    }
//
///设置取消令牌时,允许等待异步操作的代码停止等待。
/// 
/// 
/// 
/// 
/// 
/// 
取消的公共静态异步任务(此任务任务,取消令牌取消令牌)
{
var tcs=new TaskCompletionSource();
使用(cancellationToken.Register(x=>((TaskCompletionSource)x.TrySetResult(true),tcs))
{
if(task!=等待task.wheny(task,tcs.task))
抛出新操作CanceledException(cancellationToken);
}
返回等待任务;
}
它可以是从它粘贴的逐字复制品,也可以是它的派生品