11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
1
.NET 4.x

Покажите пример работы делегата для параметризованного метода

03.07.2014, 20:02. Показов 2804. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пересмотрел кучу примеров - но везде делегаты показаны без параметров. Покажите, пожалуйста, пример работы делегата для параметризованного метода. Допустим, я по нажатию на кнопку, хочу вызвать какой-то метод с параметрами, и выполнить его в отдельном потоке, вернув результат в исходный поток.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.07.2014, 20:02
Ответы с готовыми решениями:

Покажите пример работы с хранимыми процедурами
Есть БД с процедурами. Покажите пару примеров по их вызову и получению от них данных. А то искать задолбался. Вызвать без проблем, а как...

Покажите пример работы с radioButton при разработке тестов
покажите пожалуйста пример работы с radioButton при разработке тестов. допустим два вопроса. 1. сколько будет 2*2 -4 5 ...

При сравнении экземпляра делегата с именем метода, имя метода преобразуется автоматически в делегат или нет?
Добрый день. Есть несколько вопросов про событий и делегаты: 1) При сравнении экземпляра делегата с именем метода, имя метода...

20
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.07.2014, 20:10 2
AlexanderWM,
1. Делегаты могут быть какими угодно, с параметрами или без.
2. Поток создать проблем нет, единственный момент-передать туда параметры. Для этого, ятд, лучше всего создать класс-обертку для потока.
3. Ну и вернуть из потока результат тоже проблем нет, используем события, при желании-со своим собственным аргументом.
Ну и если речь за делегаты, можно потоки и с их помощью создать.
1
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
03.07.2014, 20:30  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
AlexanderWM,
1. Делегаты могут быть какими угодно, с параметрами или без.
2. Поток создать проблем нет, единственный момент-передать туда параметры. Для этого, ятд, лучше всего создать класс-обертку для потока.
3. Ну и вернуть из потока результат тоже проблем нет, используем события, при желании-со своим собственным аргументом.
Ну и если речь за делегаты, можно потоки и с их помощью создать.
Ну да. Так везде и пишут Мне бы пример реальный, чтобы разобраться
0
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.07.2014, 20:46 4
Лучший ответ Сообщение было отмечено AlexanderWM как решение

Решение

AlexanderWM, вот вам пример с делегатом, с асинхронным запуском метода и событием)))
Класс
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Messaging;
 
namespace ConsoleApplication2
{
    public class MyDelegateTest
    {
        delegate string GetString(params string[] myStrings);
        public event EventHandler operationCompleted;
        string strResult = "";
 
        public void GetResult(string[] strArr)
        {
            GetString res = new GetString(GetStringResult);
            IAsyncResult itfAR;
            itfAR = res.BeginInvoke(strArr, new AsyncCallback(CallBack), null);
        }
        private string GetStringResult(params string[] arr)
        {
            StringBuilder sb = new StringBuilder();
            foreach (string s in arr)
                sb.Append(s);
            Thread.Sleep(5000);
            return sb.ToString();
        }
        void CallBack(IAsyncResult itfAR)
        {
            AsyncResult ar=(AsyncResult)itfAR;
            GetString del=(GetString)ar.AsyncDelegate;
            strResult = del.EndInvoke(itfAR);
 
            if (operationCompleted != null)
                operationCompleted(this, EventArgs.Empty);
        }
        public string StrResult
        {
            get { return strResult; }
        }
    }
}
Проверка (в консоли, но можно и на форме)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] myStrings = { "This ", "is ", "simple ", "delegate ", "test!" };
            MyDelegateTest del = new MyDelegateTest();
            del.operationCompleted += delegate
            {
                Console.WriteLine(del.StrResult);
            };
            del.GetResult(myStrings);
 
            Console.ReadLine();
        }
    }
}
Как видите, тут мы передаем экземпляру делегата массив строк, на выходе получаем одну строку. Разбирайтесь.

Добавлено через 11 минут
AlexanderWM, советую начинать с чтения книг по этой тематике. Дело в том, что пример мне (или еще кому) написать не сложно, но есть один нюанс...
Нюанс в том, что для меня, к примеру, этот код понятен, мне точно известно, для чего там каждая строчка. А если этих знаний нет, то простое копирование, без понимания теории-пустое дело. Код можно будет применить, но только по шаблону, поскольку без понимания каждой строки изменить его вам под ваши задачи будет сложно...
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.07.2014, 20:51 5
insite2012, кстати есть мнение, что делегат события следует переприсваивать в локальную переменную, иначе между строками 36 и 37 operationCompleted может измениться, например, на null
0
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.07.2014, 20:56 6
Цитата Сообщение от Psilon Посмотреть сообщение
кстати есть мнение
Psilon, есть где почитать?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.07.2014, 21:06 7
insite2012, http://stackoverflow.com/quest... hread-safe

Добавлено через 6 минут
http://stackoverflow.com/quest... ead-safety
1
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.07.2014, 21:09 8
Psilon, а если все это дело в lock обернуть? lock вроде как самый быстрый вариант для работы с потокобезопасностью...
0
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
03.07.2014, 21:09  [ТС] 9
А если у меня параметры разного типа? Первый string, второй bool, а третий вообще CookieCollection.

Вот в этом месте:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public void GetResult(string[] strArr)
        {
            GetString res = new GetString(GetStringResult);
            IAsyncResult itfAR;
            itfAR = res.BeginInvoke(strArr, new AsyncCallback(CallBack), null);
        }
        private string GetStringResult(params string[] arr)
        {
            StringBuilder sb = new StringBuilder();
            foreach (string s in arr)
                sb.Append(s);
            Thread.Sleep(5000);
            return sb.ToString();
        }
Я думаю, что нужно в GetStringResult заменить на private string GetStringResult(params object[] list)
в GetResult заменить на public void GetResult(object[] list). А вот что вместо itfAR = res.BeginInvoke(strArr, new AsyncCallback(CallBack), null) писать?

Я хочу использовать что-то вроде:
C#
1
2
3
4
5
6
7
8
9
10
11
        public void button1_Click(object sender, EventArgs e)
        {
            object[] list = { "http://yandex.ru", false, collection};
            MyDelegateTest del = new MyDelegateTest();
            del.operationCompleted += delegate
            {
                MessageBox.Show(del.StrResult);
            };
            del.GetResult(list);
 
        }
Конечно, читать нужно. Но на примере гораздо проще разобраться. Если что-то непонятно - уже можно в msdn сползать, или даже строку кода в гугл вбить.
0
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.07.2014, 21:14 10
Цитата Сообщение от AlexanderWM Посмотреть сообщение
А если у меня параметры разного типа?
AlexanderWM, никакой разницы нет. Главное-чтобы метод, который будет целью делегата соответствовал его сигнатуре( тип возвращающего значения, количество и тип параметров).

Добавлено через 2 минуты
Цитата Сообщение от AlexanderWM Посмотреть сообщение
C#
1
object[] list = { "http://yandex.ru", false, collection}
Кстати, передавать массив типа object - не лучшая идея. Придется же потом их явно приводить к нужному типу. Может передать просто несколько строго типизированных параметров?
0
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
03.07.2014, 21:19  [ТС] 11
Цитата Сообщение от insite2012 Посмотреть сообщение
Может передать просто несколько строго типизированных параметров?
Привести к типу просто (string)list[0], (bool)list[1]... А вот как передавать параметры я не знаю. Как?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.07.2014, 21:24 12
insite2012, по ссылкам все написано же Тут тоже потокобезопасность, при этом никакого лока. А называть lock самым быстрым - это сильно Афайк он один из самых медленных. Хуже только брать мьютекс через винапи

Добавлено через 13 секунд
AlexanderWM, передай структуру, делов-то

Добавлено через 2 минуты
а еще можно не париться и написать на замыканиях:
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
using System;
using System.Linq.Expressions;
using System.Threading;
 
namespace ConsoleApplication93
{
    
    class Program
    {
        static void Main()
        {
            bool b = false;
            int a = 1;
            char c = 'H';
            string s = "WOrld!";
 
            var t = new Thread(() =>
                               {
                                   Thread.Sleep(1000);
                                   if (b)
                                    Console.WriteLine("{0} {1} {2} {3}", b, a, c, s);
                               });
            b = true;
            t.Start();
            Console.WriteLine("Main Thread!");
            t.Join();
            Console.WriteLine("Jobs done!");
        }
    }
 
    public static class MemberInfoGetter
    {
        public static string GetName<T>(Expression<Func<T>> memberExpression)
        {
            MemberExpression expressionBody = (MemberExpression)memberExpression.Body;
            return expressionBody.Member.Name;
        }
 
        static event EventHandler MyEvent;
 
        private static void OnMyEvent()
        {
            if (MyEvent != null)
                MyEvent(null, EventArgs.Empty);
        }
    }    
}
1
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.07.2014, 21:27 13
Psilon, ну как бы про lock именно так сказано... Хотя в IL он все равно разворачивается в Monitor... Хотя, может, это просто по сравнению с остальными вариантами.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.07.2014, 21:28 14
insite2012, lock очень медленный. Особенно по сравнению с отутствием синхронизации. Просто ради интереса, сравни время выполнения задачи суммы массивов через interlocked, AsParallel.Sum(), обычный lock и мьютекс/семафор
0
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
03.07.2014, 21:37  [ТС] 15
Давайте по другому. Форма. Одна кнопка. Хочу получить содержимое какой-нибудь страницы в отдельном потоке. Делаю так.

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
51
52
53
54
55
56
57
58
59
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Runtime.Remoting.Messaging;
 
namespace XXX
{
    public delegate string MyDel(string url, bool clearCookie, CookieContainer container);
    public partial class Form1 : Form
    {
 
        public Form1()
        {
            InitializeComponent();
        }
        public static string Get(string url, bool clearCookie, CookieContainer container)
        {
            string output = null;
            try
            {
                HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
                if (clearCookie) WebReq.CookieContainer = new CookieContainer();
                else WebReq.CookieContainer = container;
                WebReq.Method = "GET";
                WebReq.AllowAutoRedirect = true;
                WebReq.ContentType = "application/x-www-form-urlencoded";
 
                HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
                Stream Answer = WebResp.GetResponseStream();
                container = WebReq.CookieContainer;
                StreamReader _Answer = new StreamReader(Answer, Encoding.GetEncoding(1251));
                output = _Answer.ReadToEnd();
                return output.Trim() + "\n";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            MyDel func;
    
            var s = func.BeginInvoke("http://ya.ru", false, new CookieContainer(), null, null);
            MessageBox.Show(s.ToString());
        }
 
 
    }
}
А как надо?
0
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.07.2014, 21:42 16
AlexanderWM, я бы сделал немного по другому. Создал бы класс-оболочку для потока, через конструктор передал бы все что надо в класс, подписался на событие завершения операции, запустил операцию и ждал бы сигнала.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.07.2014, 22:30 17
я бы так делал
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
using System;
using System.IO;
using System.Net;
using System.Windows.Forms;
 
namespace WindowsFormsApplication6
{
    public partial class Form1 : Form
    {
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private async void button1_Click(object sender, EventArgs e)
        {
            const string site = "http://ya.ru";
            var wr = WebRequest.Create(site);
            using (WebResponse webResponse = await wr.GetResponseAsync())
            using (var sr = new StreamReader(webResponse.GetResponseStream()))
            {
                MessageBox.Show(sr.ReadToEnd().Remove(200));
            }
        }
    }
}
1
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.07.2014, 23:32 18
Psilon, к сожалению, как я предполагаю, C#5.0 еще далеко не у всех присутствует.
Да и знать потоковые примитивы тоже не мешает, думаю...
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2014, 00:31 19
insite2012, с этим никто не спорит, я просто показываю вариант
1
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
04.07.2014, 14:17  [ТС] 20
Про async/await в пятом шарпе я в курсе. Вот пытаюсь покрутить вариант Psilon'а.
Хочу вынести в отдельный метод. Но форма всё равно виснет. В чём ошибка?

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
 
namespace Real
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private async Task<string> GetPage(string url)
        {
            
            var wr = WebRequest.Create(url);
            using (WebResponse webResponse = await wr.GetResponseAsync())
            using (var sr = new StreamReader(webResponse.GetResponseStream()))
            {
             //   MessageBox.Show(sr.ReadToEnd().Remove(200));
                return sr.ReadToEnd().Remove(200);
            }
        
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Task<string> res = GetPage("http://ya.ru");
            string result = res.Result;
            MessageBox.Show(result);
        }
            
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.07.2014, 14:17
Помогаю со студенческими работами здесь

Покажите пример
Решил создать мини чат но я 0 в сетевом программировании. Пожалуйста покажите рабочий простейший пример клиент-сервер(желательно на VS c++...

Покажите пример "ЗЕРКАЛА"
Покажите пример &quot;ЗЕРКАЛА&quot; банят ли за них роботы? Спасибо!

Покажите пример Button'а
Покажите мне пожалуйста хоть один пример как создавать компоненты к Borland C++! Либо справочник или просто код! Заранее благодарен!

Покажите пример рекурсии
можете ,если несложно дать пример простенькой рекурсии на Assembler ? желательно факториал. хочу понять как это работает. я...

Покажите пример плейлиста
Покажите пример простого плейлиста.Пожалуйста,или дайте исходник


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Protobuf в Go и новый Opaque API
golander 15.03.2025
Распределенные системы опираются на эффективные протоколы обмена данными — о чем вы, скорее всего, прекрасно знаете, если работаете с микросервисной архитектурой. Protocol Buffers (Protobuf) от. . .
Преобразование строк в C++: std::from_chars от C++17 до C++26
NullReferenced 15.03.2025
Конвертация строк в числа — задача, с которой сталкивается практически каждый C++ разработчик. Несмотря на кажущуюся простоту, эта операция таит множество подводных камней и неочевидных последствий. . .
Управление памятью в Java и новые сборщики мусора
Javaican 15.03.2025
Эффективное управление памятью всегда было ахиллесовой пятой высоконагруженных Java-приложений. При разработке на Java мы обычно полагаемся на автоматическое управление памятью через сборщики мусора. . .
Angular или Svelte - что выбрать?
Reangularity 15.03.2025
Во фронтенд-разработке Angular и Svelte представляют собой два совершенно разных подхода к решению схожих задач. Один — полноценный, мощный монолит с корпоративной поддержкой, другой — компактный,. . .
Spring Cloud микросервисы: обнаружение и отслеживание
Javaican 15.03.2025
В разработке корпоративных приложений всё больше команд обращают внимание на микросервисную архитектуру. Но с этой архитектурой приходят и специфичные трудности: как сервисам находить друг друга в. . .
Запуск контейнера Docker в облаке
Mr. Docker 15.03.2025
Что такое Docker-контейнер? Если коротко — это легковесный, автономный пакет, содержащий всё необходимое для запуска приложения: код, зависимости, библиотеки и конфигурации. Когда мы говорим о. . .
Осваиваем Kubernetes: Подробная шпаргалка
Mr. Docker 15.03.2025
Kubernetes — это открытая платформа для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Он был создан для решения проблем, с которыми сталкиваются. . .
Лучшие PHP REST API фреймворки
Jason-Webb 15.03.2025
Современные PHP REST API фреймворки предлагают большой набор функциональности: от автоматической валидации данных и управления маршрутизацией до генерации документации и интеграции с различными. . .
Многопоточность в Java с Project Loom: виртуальные или обычные потоки
Javaican 15.03.2025
Многопоточность всегда была одноим из основных элементов в разработке современного программного обеспечения. Она позволяет приложениям обрабатывать несколько задач одновременно, что критично для. . .
Что нового в Swift 6 и особенности миграции
mobDevWorks 15.03.2025
Swift 6 — это новый крупный релиз языка программирования от Apple, анонсированный на WWDC 2024. Если вы следили за эволюцией Swift, то наверняка заметили, что многие значимые возможности, которые. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru