powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Асинхронный вызов делегата
26 сообщений из 26, показаны все 2 страниц
Асинхронный вызов делегата
    #38130158
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть
Код: c#
1.
List<object> handlers = new List<object>();



где object это

Код: c#
1.
2.
3.
4.
SyncHandlerDelegate<I, O> или VoidHandlerDelegage<I>

public delegate O SyncHandlerDelegate<I, O>(object sender, I obj);
public delegate void VoidHandlerDelegage<I>(object sender, I obj);



далее мне нужно пройти по списку
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
foreach(object handler in handlers)
{
  //Тут вызвать метод
  if (!isVoid(handler) //Для первого типа все понятно, 
  {
       var t = (MulticastDelegate)Handler; 
       object result = t.DynamicInvoke(sender, obj); // запускаем и ждем результат
       processResult(result);
  }
  else // если метод void то нужно запустить его асинхронно (так как результата нет, зачем ждать)
  {
      // КАК?
  }
}



собственно вопрос выше, что написать в ветке else...
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130208
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

а в чем проблема? Вот написал примерчик, вдруг поможет?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
 class DelegateClass1
    {
        
        delegate void VoidHandlerDelegage<I>(object sender, I obj);

        public void MyMethod()
        {
            var listdlg = new List<VoidHandlerDelegage<int>>();
            listdlg.Add((s, o) =>
                            {
                                Thread.Sleep(2000);
                                Console.WriteLine("int:" + o);
                                
                            });
            listdlg.Add((s, o) =>
            {
                Thread.Sleep(3000); 
                Console.WriteLine("int*2:" + o * 2);
                                    

        }

    );
            listdlg.ForEach(
                d =>
                d.BeginInvoke(null, 100, t => Console.WriteLine((string) t.AsyncState),
                              "delegate async end:"+d.Method.Name));
            Console.WriteLine("wait");
            Console.ReadLine();
        }
        

    }
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130267
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну или так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
 public void MyMethod()
        {
            VoidHandlerDelegage<int> delegage = null;
            int count = 0;
            do
            {
                int count1 = count;
                delegage +=
               (s, o) =>
               {
                   Thread.Sleep(2000);
                   Console.WriteLine("int:" + count1);

               };
                count++;
            } while (count<5);

            delegage.GetInvocationList()
                    .ToList()
                    .ForEach(
                        a =>
                        ((VoidHandlerDelegage<int>) a).BeginInvoke(null, 100,
                                                                   t => Console.WriteLine((string) t.AsyncState),
                                                                   "delegate async end:" + delegage.Method.Name));

                 
        
            Console.WriteLine("wait...");
            Console.ReadLine();
        }
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130359
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivan,

Блин, это то я знаю. проблема в том что тип заранее неизвестен.
и приведение сделать не можем.
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130371
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

у тебя же Void делегат один! Почему не известен то?
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130401
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivan,

где object это

SyncHandlerDelegate<I, O> или VoidHandlerDelegage<I>

public delegate O SyncHandlerDelegate<I, O>(object sender, I obj);
public delegate void VoidHandlerDelegage<I>(object sender, I obj);
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130416
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,
?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
  VoidHandlerDelegage<int> delegage = null;
            int count = 0;
            do
            {
                int count1 = count;
                delegage +=
               (s, o) =>
               {
                   Thread.Sleep(2000);
                   Console.WriteLine("int:" + count1);

               };
                count++;
            } while (count<5);
            SyncHandlerDelegate<int, int> delegateNotVoid = null;
            count = 0;
            do
            {
                int count1 = count;
                delegateNotVoid +=
               (s, o) =>
               {
                   Thread.Sleep(2000);
                   Console.WriteLine("int:" + count1);
                   return count1;

               };
                count++;
            } while (count < 5);
            //
            var delegatelist = new List<object> {delegage, delegateNotVoid};
            foreach (object o in delegatelist)
            {
                //опередляем VoidHandlerDelegage
                var handlerDelegage = o as VoidHandlerDelegage<int>;
                if (handlerDelegage != null)
                {
                    handlerDelegage.GetInvocationList()
                   .ToList()
                   .ForEach(
                       a =>
                       ((VoidHandlerDelegage<int>)a).BeginInvoke(null, 100,
                                                                  t => Console.WriteLine((string)t.AsyncState),
                                                                  "delegate async end:" + delegage.Method.Name));
                }
                else
                {
                    
                }
            }
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130447
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivan,

VoidHandlerDelegage<int>;

да не int он тут, а шаблон....
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130454
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрите на сигатуру DynamicInvoke и мозг не морщите...
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130459
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

а вызывать как его тогда будете если Т не известен? Определить то можно с рефлексией в конце концов:
Код: c#
1.
 if (o.GetType().Name == "VoidHandlerDelegage`1")
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130513
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buserпосмотрите на сигатуру DynamicInvoke и мозг не морщите...

так если вы посмотрите. на первый пост, я там и использую DynamicInvoke, он он работает синхронно.
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130605
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry :) не заметил :) что речь об архитектурных граблях...
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130683
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

ну тогда я даже не знаю как быть. Может все же избавиться от object в сторону типизации?
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130836
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123
Код: sql
1.
2.
3.
4.
5.
  else // если метод void то нужно запустить его асинхронно (так как результата нет, зачем ждать)
  {
      // КАК?
  }
}



собственно вопрос выше, что написать в ветке else...
Так.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 else // если метод void то нужно запустить его асинхронно (так как результата нет, зачем ждать)
                {
                    Action act = () => 
                    {
                        var t = (MulticastDelegate)handler;
                        t.DynamicInvoke(sender, obj);
                    };
                    act.BeginInvoke(null, null);

                }



А что, вообще I и O неизвестны? Какую задачу решаете?
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130887
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ,

Типы известны в виде

Код: c#
1.
2.
Type InputType;
Type OutputType;



Задача, свой велосипед для обмена данными между клиентами и сервером. (по tcp).
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38130939
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123ЕвгенийВ,

Типы известны в виде

Код: c#
1.
2.
Type InputType;
Type OutputType;



Задача, свой велосипед для обмена данными между клиентами и сервером. (по tcp).
Можно еще так.
Код: c#
1.
handler.GetType().InvokeMember("BeginInvoke", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance, null, handler, new object[] { sender, obj, null, null });
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38132355
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123Задача, свой велосипед для обмена данными между клиентами и сервером. (по tcp).

какой смысл ? если обмениваетесь целыми объектами то лучше и скоросрельнее чем wcf не напишите
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38132706
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pationnoob123Задача, свой велосипед для обмена данными между клиентами и сервером. (по tcp).

какой смысл ? если обмениваетесь целыми объектами то лучше и скоросрельнее чем wcf не напишите

WCF конечно хорошо. но смысл в том что сервер будет на C# + .net framework 4.5 , а клиенты и на C#, С++, под Windows mobile, Windows phone, и и еще что угодно.
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38136216
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123pationпропущено...


какой смысл ? если обмениваетесь целыми объектами то лучше и скоросрельнее чем wcf не напишите

WCF конечно хорошо. но смысл в том что сервер будет на C# + .net framework 4.5 , а клиенты и на C#, С++, под Windows mobile, Windows phone, и и еще что угодно.

ничего не мешает использовать wcf
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38136271
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pationnoob123пропущено...


WCF конечно хорошо. но смысл в том что сервер будет на C# + .net framework 4.5 , а клиенты и на C#, С++, под Windows mobile, Windows phone, и и еще что угодно.

ничего не мешает использовать wcf

пример работы с wcf сервисом из c++ хотя бы. (без net) в студию.
только не просто вызов какого нибудь сервиса, а нормальный с возможностью обратных вызовов, fullduplex вообщем.
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38136339
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123pationпропущено...


ничего не мешает использовать wcf

пример работы с wcf сервисом из c++ хотя бы. (без net) в студию.
только не просто вызов какого нибудь сервиса, а нормальный с возможностью обратных вызовов, fullduplex вообщем.
тынц
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38136436
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pationnoob123пропущено...


пример работы с wcf сервисом из c++ хотя бы. (без net) в студию.
только не просто вызов какого нибудь сервиса, а нормальный с возможностью обратных вызовов, fullduplex вообщем.
тынц

Потрясающий ответ. сам то ссылки смотрел? по первым 10 предлагают использовать или управляемую обертку, и вызывать ее из c++ кода, или просто пишут на c++ с использованием .net

или думаешь что перед изобретением своего велосипеда никто не смотрел гугл?

хотя тему можно закрывать. базовая версия "велосипеда" успешно разработана и уже используется.
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38136487
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

так поделитесь велосипедом
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38136524
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123pationпропущено...


какой смысл ? если обмениваетесь целыми объектами то лучше и скоросрельнее чем wcf не напишите

WCF конечно хорошо. но смысл в том что сервер будет на C# + .net framework 4.5 , а клиенты и на C#, С++, под Windows mobile, Windows phone, и и еще что угодно.

см web api, который сейчас в asp.net mvc 4.Пригоден для любых платформ, тк для вызова нужен только webrequest, который есть везде.
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38136726
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SeVanoob123пропущено...


WCF конечно хорошо. но смысл в том что сервер будет на C# + .net framework 4.5 , а клиенты и на C#, С++, под Windows mobile, Windows phone, и и еще что угодно.

см web api, который сейчас в asp.net mvc 4.Пригоден для любых платформ, тк для вызова нужен только webrequest, который есть везде.

читай выше, как ты будешь делать FullDuplex с помощью webrequest'ов?

netivannoob123,

так поделитесь велосипедом

не могу. проект коммерческий. и прав на него у меня нету.
...
Рейтинг: 0 / 0
Асинхронный вызов делегата
    #38137146
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123SeVaпропущено...


см web api, который сейчас в asp.net mvc 4.Пригоден для любых платформ, тк для вызова нужен только webrequest, который есть везде.

читай выше, как ты будешь делать FullDuplex с помощью webrequest'ов?

netivannoob123,

так поделитесь велосипедом

не могу. проект коммерческий. и прав на него у меня нету.

А зачем он вам нужен FullDuplex? Единственное, что приходит на ум - только для головной боли. Если в wcf он выше 200 клиентов не летает, то большие сомнения, что у вас будет лучше.
В web api для push есть интеграция с SignalR
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Асинхронный вызов делегата
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]