[英]Use Task-based Asynchronous Pattern (TAP) with .NET 4.0 and C# 4.0
有没有办法在没有 await
和async
关键字的情况下在.NET 4.0中使用基于任务的异步模式(TAP) ? (我问,因为我们陷入了C#4.0。)
此外,是否有一个使用TAP与WCF与.NET 4.0的示例?
是的你可以。 在使用异步代码时,TAP只是最佳实践的合理形式化。 基本上是一种TAP方法
Task
或Task<TResult>
。 SomeMethodAsync(...)
)。 所以,一个例子可能是
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>
对象,执行异步操作,完成后,调用SetResult
, SetException
或SetCanceled
方法,或者调用其中一种方法的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
。
我希望这有帮助。
您不需要异步/等待。 关键字可以是
ContinueWith
和TaskScheduler.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)
一个值得注意和方便的黑客是使用yield
和IEnumerable<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.