C# 任务需要的时间比返回的时间长
我有个问题。如果调用该函数,则连接到数据库的新任务需要的时间比返回的时间长,因此它将返回一些异常的内容。我想让它异步,所以我不想在没有异步的情况下这样做。如何解决这个问题,显然,“等待新任务(()=>”不能正常工作 我最初做的是非异步的,但这给我带来了问题C# 任务需要的时间比返回的时间长,c#,asynchronous,tcp,return,task,C#,Asynchronous,Tcp,Return,Task,我有个问题。如果调用该函数,则连接到数据库的新任务需要的时间比返回的时间长,因此它将返回一些异常的内容。我想让它异步,所以我不想在没有异步的情况下这样做。如何解决这个问题,显然,“等待新任务(()=>”不能正常工作 我最初做的是非异步的,但这给我带来了问题 using System.Threading.Tasks; class Security { public async Task<bool> CheckAccount(string rowrequest_)
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;
}
}
使用System.Threading.Tasks;
班级安全
{
公共异步任务CheckAccount(字符串rowrequest\uUx)
{
提取=新提取();
string password=string.Empty,username=string.Empty,returndata=string.Empty;
bool x=等待新任务(()=>
{
DatabaseConnection=新建DatabaseConnection();
username=extract.ExtractValue(rowrequest_u2;“username”);
password=extract.ExtractValue(rowrequest_u2;,“password”);
字符串连接str=“frozenfiredb::std@basicconnection((dbuser)程序(*dbuser)(dbpassword)K%ls!Sfgh3lloW%0rld45(*dbpassword)(dbtable)Casinoser(*dbtable))(读取内容)“+username+”(*读取内容))”;
returndata=connection.StaticConnection(connectionStr);
return!returndata.StartsWith(“文件错误”)&&password==returndata;
});
返回x;
}
}
输出不正确
显然,“等待新任务(()=>”不能正常工作
你应该
理想情况下,您应该从最低级别的数据库API开始,并将它们更改为使用*Async
API(使用wait
),然后让Async
从中增长。很难判断I/O在您的代码示例中的位置,但有一种可能是这样的:
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
。它必须是多客户端的。默认数据库超时为30秒。如果您得到奇怪的结果,则可能会出现错误,或者检索数据需要很长时间,可能会导致错误我的时间更长了。这个问题与等待无关。我自己建立了这个数据库,所以实际上没有任何超时。
public bool CheckAccount(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 = connection.StaticConnection(connectionStr);
return !returndata.StartsWith("FILE ERROR") && password == returndata;
}
...
string rowrequest = ...;
bool result = await Task.Run(() => CheckAccount(rowrequest));