none
Асинхронный вызов методов RRS feed

  • Вопрос

  • Да, конечно, просто я пока разбирался, и не спешил ставить отметку, так как после этого никто уже не ответит). То есть, если существует единственный экземпляр класса, который содержит методы с полями и переменными, он является как-бы синхронным, и чтобы использовать эти методы асинхронно, надо писать обертку для каждого из них? Есть ли более простой способ сделать это, чем что-то типа такого для каждого метода:

      public int Method(int a, int b)
      {
      }
     public IAsyncResult BeginMethod(int a, int b, AsyncCallback callBack)
     {
      AsyncSumCaller asyncSumCaller = new AsyncSumCaller(Method);
      return asyncSumCaller.BeginInvoke(a, b, callBack, this);
     }
    
     public int EndMethod(IAsyncResult ar)
     {
      AsyncSumCaller asyncSumCaller = (AsyncSumCaller)((AsyncResult)ar).AsyncDelegate;
      return asyncSumCaller.EndInvoke(ar);
    
    
     

    Или, может, можно вообще сразу написать асинхронный метод, или там пометить его каким-то атрибутом, чтобы при компиляции он преобразовывался в асинхронный, или там использовался при вызове как асинхронный? Наверняка так можно сделать, особенно если метод ничего не возвращает?

    19 января 2011 г. 20:44

Ответы

  • Если не нужно дожидаться выполнения, или есть возможность передать continuation - то есть ThreadPool.QueueUserWorkItem.

    В четвертом .NET есть Task Parallel Library, с красивым синтаксисом и поддержкой отладки тасков в Visual Studio.

    В пятом C# - родная поддержка асинхронности на уровне синтаксиса.


    My blog
    • Помечено в качестве ответа Qwester33 19 января 2011 г. 21:01
    • Предложено в качестве ответа PashaPashModerator 20 января 2011 г. 5:52
    • Помечено в качестве ответа Qwester33 20 января 2011 г. 7:43
    19 января 2011 г. 20:55
    Модератор
  • Это Data Parrallelism. Делается через тот же TPL, описан в соседнем разделе. Делается без заведения отдельного класса.

    http://msdn.microsoft.com/en-us/library/dd537608.aspx

     


    My blog
    • Помечено в качестве ответа Qwester33 19 января 2011 г. 21:20
    • Предложено в качестве ответа PashaPashModerator 20 января 2011 г. 5:52
    • Помечено в качестве ответа Qwester33 20 января 2011 г. 7:43
    19 января 2011 г. 21:15
    Модератор
  • А, тогда да. Если у Вас есть возможность использовать в качестве платформы .NET 4.0, то TPL, как предложил PashaPash выше, будет наиболее оптимальным решением.
    • Помечено в качестве ответа Qwester33 19 января 2011 г. 21:20
    • Предложено в качестве ответа PashaPashModerator 20 января 2011 г. 5:52
    • Помечено в качестве ответа Qwester33 20 января 2011 г. 7:44
    19 января 2011 г. 21:15

Все ответы

  • Если не нужно дожидаться выполнения, или есть возможность передать continuation - то есть ThreadPool.QueueUserWorkItem.

    В четвертом .NET есть Task Parallel Library, с красивым синтаксисом и поддержкой отладки тасков в Visual Studio.

    В пятом C# - родная поддержка асинхронности на уровне синтаксиса.


    My blog
    • Помечено в качестве ответа Qwester33 19 января 2011 г. 21:01
    • Предложено в качестве ответа PashaPashModerator 20 января 2011 г. 5:52
    • Помечено в качестве ответа Qwester33 20 января 2011 г. 7:43
    19 января 2011 г. 20:55
    Модератор
  • Экземпляры класса и потоки — это разные сущности.

    Почитайте о многопоточности в .NET вот здесь , после этого у Вас больше не останется вопросов.

    19 января 2011 г. 20:58
  • Да-да, я примерно это и имел в виду. Как раз хотел уточнить про TPL. Спасибо, буду пробовать сделать через TPL.
    19 января 2011 г. 21:01
  • Читал и понимаю, что разные.

    У меня какая проблема: есть объекты и есть операции над ними. При этом, часто нужно выполнять одну и ту же операцию над разными объектами одновременно. Вот я и хочу инкапсулировать все эти операции в один класс, и сделать так, чтобы при необходимости выполнить действие с объектом, я просто вызывал это действие, а класс, в котором эти действия инкапсулированы, уже сам обеспечивал асинхронное выполнение операции. То есть, чтобы одновременно выполнять одну и ту же операцию над разными объектами.

    19 января 2011 г. 21:11
  • Это Data Parrallelism. Делается через тот же TPL, описан в соседнем разделе. Делается без заведения отдельного класса.

    http://msdn.microsoft.com/en-us/library/dd537608.aspx

     


    My blog
    • Помечено в качестве ответа Qwester33 19 января 2011 г. 21:20
    • Предложено в качестве ответа PashaPashModerator 20 января 2011 г. 5:52
    • Помечено в качестве ответа Qwester33 20 января 2011 г. 7:43
    19 января 2011 г. 21:15
    Модератор
  • А, тогда да. Если у Вас есть возможность использовать в качестве платформы .NET 4.0, то TPL, как предложил PashaPash выше, будет наиболее оптимальным решением.
    • Помечено в качестве ответа Qwester33 19 января 2011 г. 21:20
    • Предложено в качестве ответа PashaPashModerator 20 января 2011 г. 5:52
    • Помечено в качестве ответа Qwester33 20 января 2011 г. 7:44
    19 января 2011 г. 21:15