繁体   English   中英

在.NET 4.0和C#4.0中使用基于任务的异步模式(TAP)

[英]Use Task-based Asynchronous Pattern (TAP) with .NET 4.0 and C# 4.0

有没有办法在没有 awaitasync关键字的情况下在.NET 4.0中使用基于任务的异步模式(TAP) (我问,因为我们陷入了C#4.0。)

此外,是否有一个使用TAP与WCF与.NET 4.0的示例?

是的你可以。 在使用异步代码时,TAP只是最佳实践的合理形式化。 基本上是一种TAP方法

  1. 返回“热”(正在运行) TaskTask<TResult>
  2. 有一个'Async'后缀(例如SomeMethodAsync(...) )。
  3. 超载以接受取消令牌。
  4. 快速返回调用者(初始化阶段较小)。
  5. 如果I / O绑定,则不会占用线程。

所以,一个例子可能是

private Task SomeMethodAsync(CancellationToken token)
{
    return Task.Factory.StartNew(() => 
    {
        // Do something...
    }, token);
}

使用该方法并附加使用UI同步上下文的continuation。

private void SomeOtherMethod()
{
    var tokenSource = new CancellationTokenSource();
    CancellationToken token = tokenSource.Token;
    TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext()

    // Options 1.
    Task t = SomeMethodAsync(token);
    Task c = t.ContinueWith(ant => 
        { 
            /* Do something and check exceptions */
        }, CancellationToken.None,
           TaskContinuationOptions.None, 
           scheduler);

    // Options 2.
    SomeMethodAsync(token).ContinueWith(ant => 
        { 
            /* Do something and check exceptions */
        }, CancellationToken.None,
           TaskContinuationOptions.None, 
           scheduler);
}

或者一气呵成

Task t = Task.Factory.StartNew(() => 
    {
        /* Do Something */
    }, token).ContinueWith(ant => 
        { 
            /* Do something on UI thread after task has completed and check exceptions */
        }, CancellationToken.None,
           TaskContinuationOptions.None, 
           scheduler);

您还可以手动实现TAP模式,以便更好地控制实现。 要自己实现TAP,可以创建TaskCompletionSource<TResult>对象,执行异步操作,完成后,调用SetResultSetExceptionSetCanceled方法,或者调用其中一种方法的Try版本。 手动实现TAP方法时,必须在表示的异步操作完成时完成生成的任务。 例如:

public static Task<int> ReadTask(this Stream stream, 
    byte[] buffer, int offset, int count, object state)
{
    var tcs = new TaskCompletionSource<int>();
    stream.BeginRead(buffer, offset, count, ar =>
    {
        try { tcs.SetResult(stream.EndRead(ar)); }
        catch (Exception exc) { tcs.SetException(exc); }
    }, state);
    return tcs.Task;
}

从消费者处消费TaskCompleationSource

我希望这有帮助。

您不需要异步/等待。 关键字可以是

ContinueWithTaskScheduler.FromCurrentSynchronizationContext

Task.Factory.StartNew(() => { return "test"; } )
            .ContinueWith(task => { this.textBox1.Text = task.Result; },
                            CancellationToken.None,
                            TaskContinuationOptions.None, 
                            TaskScheduler.FromCurrentSynchronizationContext());

这大致相当于

var str = await SomeFuncAsync() //returning "test";
this.textBox1.Text = str;

有没有办法在没有关键字await或async的.NET 4.0中使用基于任务的异步模式(TAP)? 我问,因为我们陷入了C#4)

一个值得注意和方便的黑客是使用yieldIEnumerable<Task> 例如,来自Stephen Toub的“使用任务处理异步操作的序列”

IEnumerable<Task> DoExample(string input) 
{ 
    var aResult = DoAAsync(input); 
    yield return aResult; 
    var bResult = DoBAsync(aResult.Result); 
    yield return bResult; 
    var cResult = DoCAsync(bResult.Result); 
    yield return cResult; 
    … 
}

… 
Task t = Iterate(DoExample(“42”));

这样,您就可以拥有类似于async/await的伪同步线性代码流。

如果没有async / await关键字,您将无法利用编译器提供的简便性来使用新模式。 但是,您可以使用.NET 4框架中的任务并行库(TPL)来利用基于任务的并行性

是的,有。 我想到了“开始/结束”方法的异步包装器;

public static Task<WebResponse> GetResponseAsync(this WebRequest client)
{
return Task<WebResponse>.Factory.FromAsync(client.BeginGetResponse,
client.EndGetResponse, null);
}

我猜你在寻找什么用任务实现WCF异步服务操作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM