我有问题。如果我调用该函数,则连接到数据库的新Task需要比返回更长的时间,因此它将返回一些奇怪的东西。我想使这个异步,所以我不想没有异步。如何解决此问题,显然,“等待新Task(()=>”)无法正常工作。
我本来就是这个非异步的,但是这让我很麻烦。
using System.Threading.Tasks;
class Security
{
public async Task<bool> CheckAccount(string rowrequest_)
{
Extract extract = new Extract();
string password = string.Empty, username = string.Empty, returndata = string.Empty;
bool x = await new Task<bool>(() =>
{
DatabaseConnection connection = new DatabaseConnection();
username = extract.ExtractValue(rowrequest_, "username");
password = extract.ExtractValue(rowrequest_, "password");
string connectionStr = "frozenfiredb::std@basicconnection~(((dbuser)program(*dbuser)(dbpassword)K%ls!Sfgh3lloW%0rld45(*dbpassword)(dbtable)CasinoUser(*dbtable))(read_content)" + username + "(*read_content))";
returndata = connection.StaticConnection(connectionStr);
return !returndata.StartsWith("FILE ERROR") && password == returndata;
});
return x;
}
}
输出不正确。
答案 0 :(得分:1)
显然,“等待新Task(()=>”)无法正常工作。
您应该never, ever, ever use the Task
constructor。
理想情况下,您应该开始使用最低级别的数据库API,并更改它们以使用*Async
API(带有await
),然后让{{1} }从那里成长。很难确定I / O在代码示例中的位置,但是这是一种看起来可能的样子:
async
如果这不可能(由于API限制)或可行(目前工作量过多),并且如果您的代码在GUI应用程序(不是ASP.NET)中,那么您可以使该方法保持同步,并使用public async Task<bool> CheckAccountAsync(string rowrequest_)
{
Extract extract = new Extract();
string password = string.Empty, username = string.Empty, returndata = string.Empty;
DatabaseConnection connection = new DatabaseConnection();
username = extract.ExtractValue(rowrequest_, "username");
password = extract.ExtractValue(rowrequest_, "password");
string connectionStr = "frozenfiredb::std@basicconnection~(((dbuser)program(*dbuser)(dbpassword)K%ls!Sfgh3lloW%0rld45(*dbpassword)(dbtable)CasinoUser(*dbtable))(read_content)" + username + "(*read_content))";
returndata = await connection.StaticConnectionAsync(connectionStr);
return !returndata.StartsWith("FILE ERROR") && password == returndata;
}
异步地调用:
Task.Run