Задача требует дольше, чем возврат - PullRequest
0 голосов
/ 16 апреля 2019

У меня проблема.Если я вызываю функцию, новой Задаче, которая подключается к базе данных, требуется больше времени, чем при возврате, поэтому она вернет что-то утомленное.Я хочу сделать это асинхронным, поэтому я не хочу делать это без асинхронного.Как это исправить, по-видимому, «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;
        }
    }

Вывод неправильный.

1 Ответ

1 голос
/ 17 апреля 2019

очевидно, "ожидание новой задачи (() =>" не работает должным образом.

Вы не должны никогда, никогда, никогда не использовать конструктор Task .

В идеале вам следует запустить с вашими API-интерфейсами базы данных самого низкого уровня и изменить их на использование *Async API (с await), а затем позволить async расти оттуда. Трудно сказать, где находится ввод-вывод в вашем примере кода, но вот одна из возможностей, как это может выглядеть:

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) или выполнимо (сейчас слишком много работы), и , если ваш код находится в приложении с графическим интерфейсом (не 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));
...