任务需要比返回更长的时间

时间:2019-04-16 15:52:20

标签: c# asynchronous tcp return task

我有问题。如果我调用该函数,则连接到数据库的新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;
        }
    }

输出不正确。

1 个答案:

答案 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