gpt4 book ai didi

c# - TrySetException 处理

转载 作者:太空宇宙 更新时间:2023-11-03 21:37:12 31 4
gpt4 key购买 nike

对于下面的代码,有人可以解释一下吗谁处理 tcs.TrySetException(t.Exception.InnerExceptions);异常(exception)?是丢给用户?什么时候调用 EndDevide?

public class Calculator : ICalculator
{
public IAsyncResult BeginDivide(uint numerator, uint denominator, AsyncCallback callback, object state)
{
// See the Task-Based Asynchronous Pattern document for an explanation of the Begin/End implementations.
var tcs = new TaskCompletionSource<uint>(state);
var task = DivideAsync(numerator, denominator);
task.ContinueWith(t =>
{
if (t.IsFaulted)
tcs.TrySetException(t.Exception.InnerExceptions);
else if (t.IsCanceled)
tcs.TrySetCanceled();
else
tcs.TrySetResult(t.Result);

if (callback != null)
callback(tcs.Task);
});

return tcs.Task;
}

public uint EndDivide(IAsyncResult asyncResult)
{
try
{
return ((Task<uint>)asyncResult).Result;
}
catch (AggregateException ex)
{
// Note: the original stack trace is lost by this re-throw, but it doesn't really matter.
throw ex.InnerException;
}
}
}

最佳答案

您需要知道 Task 类和 async/await 是异步编程的新首选工具。以前的异步模型使用 BeginXxx() 启动 Xxx 异步操作,使用 EndXxx() 等待异步操作结束。

如今,在新代码中,您必须使用异步方法。 等待结果 = DivideAsync(....);

提供 BeginDivide() 和 EndDivide() 是为了向后兼容。

任务系统在任务完成并返回其结果时通过重新抛出异常来将异步异常传播给调用者(但将完成/异常状态传递给 ContinueWith() 代码)具有很大的优势。 Continue with 代码在异步操作结束时调用回调,并允许使用 EndDivide() 等待,提供在 EndXxx() 期间返回异常的旧范例。

Task 的内部结构非常有趣:Task 不仅是线程的光照映射器,而且是处理异步操作(包括 I/O 操作)的完整系统。对于新代码,只忘记了旧的开始/结束范式。

如果将 DivideAsync() 方法委托(delegate)给像 GPU、网络资源这样的“外围设备”,则该方法很有趣... 备注:按照惯例,我们不会在创建线程的方法名称后缀为“Async”,因为没有线程,异步是轻量级的但它可以出现在某些图书馆中。

关于c# - TrySetException 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21150007/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com