从本身包含任务的任务返回结果
本文关键字:任务 结果 返回 包含 | 更新日期: 2023-09-27 18:34:27
我有一个非异步方法,需要等待另一个方法的结果。 该方法本身构建一个任务数组,并等待所有任务,然后返回布尔结果。 我不得不完成名为 Async 的任务,现在我无法从中获取一个简单的布尔值。 当你阅读下面的代码时,除了"StartNew ProcessDbList"行之外,它都编译了,它说它不能将Task
public bool ProcessInbox(List<SessionContext> sessionContextList, FsFcsService curSvc)
{
bool resultBool = false;
List<SessionContext> tempSessionList = sessionContextList.ToList();
//below is the line that will not compile with the type conversion error
Task<bool> theTask = Task<bool>.Factory.StartNew(() => ProcessDbList(tempSessionList, curSvc));
resultBool = theTask.Result;
return resultBool;
}
public async Task<bool> ProcessDbList(List<SessionContext> sessionList, FsFcsService curSvc)
{
bool resultBool = false;
IEnumerable<Task<bool>> TasksList =
from SessionContext session in sessionList select ProcessDb(session, curSvc);
Task<bool>[] TaskArray = TasksList.ToArray();
// Await the completion of all the running tasks.
// this line is what forces the method to be Async and return a Task<bool>
bool[] resultsArr = await Task.WhenAll(TaskArray);
foreach (bool indivResult in resultsArr)
{
if (indivResult)
{
// if any result is true, this method returns true
resultBool = true;
break;
}
}
// this is where I should probably be returning something other than a simple bool
return resultBool;
}
我有一个非异步方法,需要等待另一个方法的结果。
理想的答案是使调用方法async
:
public async Task<bool> ProcessInboxAsync(List<SessionContext> sessionContextList, FsFcsService curSvc)
{
bool resultBool = false;
List<SessionContext> tempSessionList = sessionContextList.ToList();
return await ProcessDbList(tempSessionList, curSvc);
}
毕竟,该方法正在执行异步工作,因此它应该是异步的。有各种技巧可以尝试强制异步工作同步完成,但没有一个适用于所有场景。最好的解决方案是让异步方法自然地表示异步工作。
附言如果要在后台线程上运行 CPU 密集型工作,请使用 Task.Run
; StartNew
是危险的,应避免。但是,在这种情况下,根本不需要后台线程。
我假设"ProcessDB"在这里是一个异步方法,在这种情况下,您无需担心将结果包装在这里的另一个任务中:
Task<bool> theTask = Task<bool>.Factory.StartNew(() => ProcessDbList(tempSessionList, curSvc));
而是直接使用返回的任务,因为使用 Result 属性时无论如何都会阻止结果。
尝试:
Task<bool> theTask = ProcessDbList(tempSessionList, curSvc);
<</div>
div class="answers">Adam Rhodes已经说过你不需要把它包装在任务中,你也可以在从同步方法调用异步方法时使用.Result
。
public bool ProcessInbox(List<SessionContext> sessionContextList, FsFcsService curSvc)
{
return ProcessDbList(sessionContextList.ToList(), curSvc).Result;
}