Несколько задач, выполняющихся одним и тем же методом - PullRequest
1 голос
/ 22 мая 2019

У меня есть сетка с несколькими запросами SQL, которую я хочу, чтобы пользователи разрешали выполнять, когда они дважды щелкают по строке в сетке.Я хочу, чтобы пользователь мог запускать несколько запросов одновременно.

У меня есть небольшая Форма с индикатором выполнения и таймером для каждого запроса.Форма отображается при выполнении запроса и отображается завершенным после его завершения.

Ниже мой код, кажется, что метод, возвращающий данные, блокирует.Я не работал с sync / threads / tasks раньше

if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{

    CancellationTokenSource cts = new CancellationTokenSource();
    CancellationTokenHook hook = new CancellationTokenHook(cts);
    CancellationToken token = cts.Token;
    //this.waitFormActivator.ShowWaitForm(true, true);
    //this.waitFormActivator.SetWaitFormObject(hook);
    Exception exception = null;
    try
    {

      progressControl.Start();

      Task<Dataset> t = Test(command.CommandText, token, saveFileDialog1.FileName);

      var result = await t;

      progressControl.Stop(); 

     }
     catch (Exception ex)
     {
        //success = false;
        exception = ex;
        //return null;
     }                               
 }

Я бы хотел, чтобы запросы выполнялись независимо друг от друга, однако в настоящее время следующий запрос ожидает завершения предыдущего.

1 Ответ

0 голосов
/ 22 мая 2019

Предполагается, что этот фрагмент кода ответит на ваш вопрос

        List<Task> tasks = new List<Task>();

        tasks.Add(new Task(() => { action1 }));
        tasks.Add(new Task(() => { action2 }));
        tasks.Add(new Task(() => { action3 }));
        tasks.Add(new Task(() => { action4 }));

        Task.WhenAll(tasks);

В вашем контексте он должен быть таким:

if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{

    CancellationTokenSource cts = new CancellationTokenSource();
    CancellationTokenHook hook = new CancellationTokenHook(cts);
    CancellationToken token = cts.Token;
    his.waitFormActivator.ShowWaitForm(true, true);
    his.waitFormActivator.SetWaitFormObject(hook);
    eption exception = null;
    try
    {

      progressControl.Start();
      List<Task<Dataset>> tasks = new List<Task<DataSert>>();

      Task<Dataset> t1 = Test(command.CommandText, token, saveFileDialog1.FileName);
      Task<Dataset> t2 = Test(command.CommandText, token, saveFileDialog1.FileName);
      Task<Dataset> t3 = Test(command.CommandText, token, saveFileDialog1.FileName);
      Task<Dataset> t4 = Test(command.CommandText, token, saveFileDialog1.FileName);

      tasks.Add(t1);
      tasks.Add(t2);
      tasks.Add(t3);
      tasks.Add(t4);

      var result = Task.WhenAll(tasks);

      progressControl.Stop(); 

    }
    catch (Exception ex)
    {
        //success = false;
        exception = ex;
        //return null;
    }                               
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...