有没有一种方法可以在.NET 4.0中不使用await
和async
关键字来使用Task-based Asynchronous Pattern (TAP)?(我之所以问是因为我们被困在C#4.0中。)
另外,有没有一个在.NET 4.0中使用TAP与WCF的示例?
有没有一种方法可以在.NET 4.0中不使用await
和async
关键字来使用Task-based Asynchronous Pattern (TAP)?(我之所以问是因为我们被困在C#4.0中。)
另外,有没有一个在.NET 4.0中使用TAP与WCF的示例?
Task
或Task<TResult>
。SomeMethodAsync(...)
)。private Task SomeMethodAsync(CancellationToken token)
{
return Task.Factory.StartNew(() =>
{
// Do something...
}, token);
}
使用该方法并附加继续使用UI同步上下文。
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;
有没有一种方法可以在.NET 4.0中使用基于任务的异步模式(TAP)而不使用关键字await或async?我问这个问题是因为我们被困在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
的伪同步线性代码流。是的,有的。我想到了针对“Begin/End”方法的异步包装器;
public static Task<WebResponse> GetResponseAsync(this WebRequest client)
{
return Task<WebResponse>.Factory.FromAsync(client.BeginGetResponse,
client.EndGetResponse, null);
}
我猜你想要的是 使用Task实现WCF异步服务操作
如果没有async/await关键字,您将无法利用编译器提供的便利来使用新模式。但是,您可以利用基于任务的并行性,使用.NET 4框架中的任务并行库(TPL)
await/async
的 C#5 代码编译为 .net 4.0 程序集。您只需要引用异步目标包(它在 nuget 上)即可使其正常运行。如果由于某种原因您被困在 C#4 编译器中,请参阅您的问题的答案,答案是肯定的。 - jods