Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务需要的时间比返回的时间长_C#_Asynchronous_Tcp_Return_Task - Fatal编程技术网

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));