.net core Task.IsFaulted未捕获.Net core中的异常

.net core Task.IsFaulted未捕获.Net core中的异常,.net-core,.net Core,Task.IsFaulted未捕获异常。即使条件为false,它也会发送到else块。你能告诉我哪里做错了吗。我尝试实现尝试。。。捕捉,但仍不工作 public async Task sendmailasync(字符串userid、字符串fullname、字符串注释) { 字符串contentRootPath=\u hostingEnvironment.contentRootPath; 字符串json=System.IO.File.ReadAllText(“appsettings.json”);

Task.IsFaulted
未捕获异常。即使条件为false,它也会发送到else块。你能告诉我哪里做错了吗。我尝试实现
尝试。。。捕捉
,但仍不工作

public async Task sendmailasync(字符串userid、字符串fullname、字符串注释)
{
字符串contentRootPath=\u hostingEnvironment.contentRootPath;
字符串json=System.IO.File.ReadAllText(“appsettings.json”);
JObject obj=JObject.Parse(json);
字符串email=(字符串)obj[“sendmailto”];
string subject=“反馈人:“+fullname+”(“+userid+”)”;
//wait\u emailSender.SendEmailAsync(contentRootPath、电子邮件、主题、注释、用户名、全名);
var result=\u emailSender.SendEmailAsync(contentRootPath、电子邮件、主题、注释、用户名、全名);
字符串responseString=“”;
如果(result.IsFaulted)
{
尝试
{
responseString=@“
很抱歉,您的反馈未成功完成

"; } 抓住 { responseString=@“ 反馈已成功提交

"; } } 返回等待任务。FromResult(responseString); }
您的
sendmailasync()
看起来像一个异步方法,它很可能返回一个
任务。如果要检查任务是否成功,则必须等待任务完成

var result = _emailSender.SendEmailAsync(contentRootPath, email, subject, comment, userid, fullname);
result.Wait();
if (result.IsFaulted)
....

根据您的
sendmailasync()
实现,您可能只需将
try/catch
wait
一起使用即可:

try
{
    await _emailSender.SendEmailAsync(contentRootPath, email, subject, comment, userid, fullname);
    ...
}
catch
{
    ...
}
您的
sendmailasync()
看起来像一个异步方法,它很可能返回一个
任务。如果要检查任务是否成功,则必须等待任务完成

var result = _emailSender.SendEmailAsync(contentRootPath, email, subject, comment, userid, fullname);
result.Wait();
if (result.IsFaulted)
....

根据您的
sendmailasync()
实现,您可能只需将
try/catch
wait
一起使用即可:

try
{
    await _emailSender.SendEmailAsync(contentRootPath, email, subject, comment, userid, fullname);
    ...
}
catch
{
    ...
}

IsFaulted
不等待任务完成或出现故障,它只检查任务的当前状态。在您的情况下,您正在异步发送电子邮件,而不是等待操作完成,然后测试可能仍在运行的
任务
的状态(尚未处于故障状态)

要解决此问题,您可以将等待的呼叫包装在try/catch块中

试试看
{
wait\u emailSender.SendEmailAsync(contentRootPath、电子邮件、主题、注释、用户名、全名);
}
捕获(异常)
{
返回@”
很抱歉,您的反馈未成功完成

"; } 返回@” 反馈已成功提交

";
…或考虑
任务
返回方法,在这些方法中,您可以在任务完成后测试成功/失败的结果,例如

public async Task sendmailasync(字符串userid、字符串fullname、字符串注释)
{
字符串contentRootPath=\u hostingEnvironment.contentRootPath;
字符串json=System.IO.File.ReadAllText(“appsettings.json”);
JObject obj=JObject.Parse(json);
字符串email=(字符串)obj[“sendmailto”];
string subject=“反馈人:“+fullname+”(“+userid+”)”;
异步任务SendEmailAsync()
{
尝试
{
wait\u emailSender.SendEmailAsync(contentRootPath、电子邮件、主题、注释、用户名、全名);
}
捕获(异常)
{
//TODO:日志异常等。
返回false;
}
返回true;
}
var succeed=wait sendmailasync();
如果(成功)
{
返回@”
反馈已成功提交

"; } 其他的 { 返回@” 很抱歉,您的反馈未成功完成

"; } }
IsFaulted
不等待任务完成或出现故障,它只检查任务的当前状态。在您的情况下,您正在异步发送电子邮件,而不是等待操作完成,然后测试可能仍在运行的
任务
的状态(尚未处于故障状态)

要解决此问题,您可以将等待的呼叫包装在try/catch块中

试试看
{
wait\u emailSender.SendEmailAsync(contentRootPath、电子邮件、主题、注释、用户名、全名);
}
捕获(异常)
{
返回@”
很抱歉,您的反馈未成功完成

"; } 返回@” 反馈已成功提交

";
…或考虑
任务
返回方法,在这些方法中,您可以在任务完成后测试成功/失败的结果,例如

public async Task sendmailasync(字符串userid、字符串fullname、字符串注释)
{
字符串contentRootPath=\u hostingEnvironment.contentRootPath;
字符串json=System.IO.File.ReadAllText(“appsettings.json”);
JObject obj=JObject.Parse(json);
字符串email=(字符串)obj[“sendmailto”];
string subject=“反馈人:“+fullname+”(“+userid+”)”;
异步任务SendEmailAsync()
{
尝试
{
wait\u emailSender.SendEmailAsync(contentRootPath、电子邮件、主题、注释、用户名、全名);
}
捕获(异常)
{
//TODO:日志异常等。
返回false;
}
返回true;
}
var succeed=wait sendmailasync();
如果(成功)
{
返回@”
反馈已成功提交

"; } 其他的 { 返回@” 很抱歉,您的反馈未成功完成

"; } }
result.Wait()
Wait result
都将在任务出现故障时抛出,因此在这种情况下,
if(result.IsFaulted)
之后的测试将无法访问。
result。