【发布时间】:2016-12-08 17:16:09
【问题描述】:
下面的代码解释了这个想法
private async void button1_Click(object sender, EventArgs e)
{
string result;
CancellationToken cancellationToken = new CancellationTokenSource(3000).Token;
try
{
result = await GetDataAsync(cancellationToken)
.ContextIfSuccess(); // Should use SynchronizationContext only if Task status is RanToCompletion
}
catch(OperationCanceledException)
{
/* Context is not required */
return;
}
catch (Exception ex)
{
/* Context is not required otherwise it can slow down UI Thread a little bit */
Log(ex.ToString());
return;
}
/* UI Thread only */
button1.Text = result;
}
问题是“是否可以制作像 ContextIfSuccess() 这样的方法?”
【问题讨论】:
-
为什么像
SynchronizationContext这样的实现细节对你很重要? -
因为我不想无缘无故地中断 UI 线程,尤其是在移动设备上
-
然后使用异步缓冲区进行日志记录? log4j 提供了开箱即用的功能。另外,这真的是对性能的显着影响吗?
-
Log() 只是工作的一个例子,最好不要打扰 UI 线程
-
请注意,当您将
try更改为button1.Text = await ...时,您的方法会更加更简洁。那么result变量或return调用就没有理由了;它只是不必要地使代码复杂化。
标签: c# async-await task synchronizationcontext