【问题标题】:Task needs longer than return任务需要比返回更长的时间
【发布时间】:2019-04-16 15:52:19
【问题描述】:

我有问题。如果我调用该函数,连接到数据库的新任务需要的时间比返回时间长,所以它会返回一些奇怪的东西。我想让这个异步,所以我不想在没有异步的情况下这样做。如何解决这个问题,显然,“await new 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;
        }
    }

输出不正确。

【问题讨论】:

  • 你为什么要通过创建新任务来强制异步有什么具体原因吗?
  • 没有任何理由在您的代码中使用Task
  • 它必须是多客户端的。
  • 默认数据库超时为 30 秒。如果您得到奇怪的结果,那么您要么得到错误,要么需要很长时间才能检索数据,并且可能会使超时时间更长。该问题与等待无关。
  • 我自己制作了这个数据库,所以几乎没有任何超时。

标签: c# asynchronous tcp return task


【解决方案1】:

显然,“await new Task(() =>”没有正常工作。

你应该never, ever, ever use the Task constructor

理想情况下,您应该从最低级别的数据库 API 开始,然后将它们更改为使用 *Async API(使用 await),然后让 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;
}

如果这不可行(由于 API 限制)或可行(目前工作量太大),并且如果您的代码位于 GUI 应用程序(不是 ASP.NET)中,那么您可以保持此方法同步,只需使用Task.Run 异步调用它:

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

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2014-07-21
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-28
    • 2022-06-20
    相关资源
    最近更新 更多