Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
.NET 2.x

Вызов метода асинхронно

01.07.2013, 17:42. Показов 2509. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Необходимо, что бы вызов метода Method происходил асинхронно (ну т.е. сам метод выполняся асинхронно), все мои попытки приводили к ошибкам при компиляции, прошу помощи, заранее спасибо!
Код ниже:
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
namespace testClassLib
{
    public class Viz : ExternalLib
    {
        public override void Open(string param)
        {
            SaveToLog(0, "Open");
            //throw new NotImplementedException();
        }
 
        public override string [B]Method[/B](string param)
        {
            SaveToLog(0, param);
            string str = null;
            try
            {
                str = SendExternalRequest(param);
            }
            catch (Exception)
            {
 
            }
            //throw new NotImplementedException();
            return str;
        }
 
        public override void Close(string param)
        {
            //throw new NotImplementedException();
        }
 
    }
}
Добавлено через 58 минут
Всех смущает второй фрэймворк?=)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.07.2013, 17:42
Ответы с готовыми решениями:

Вызов всех методов класса асинхронно
Есть класс в нем методы работы с апи, все они вызываются синхронно, встала задача вызывать их асинхронно. Класс изменять нельзя. Как лучше...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что метод не утрачивает связи с базовым...

Какой из вызовов требуется для выполнения метода асинхронно
A) Delegate.Invoke B) Delegate.Beginlnvoke C) Delegate.Call D) Delegate.Dynamiclnvoke

14
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
01.07.2013, 17:50
Асинхронный вызов синхронных методов
0
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
02.07.2013, 10:32  [ТС]
читал, но вот только как-то мне это не помогло, а именно я не догнал вот эту строку от туда
Чтобы скомпилировать эти примеры кода, необходимо включить определения для метода TestMethod и делегата AsyncMethodCaller.
и еще мне надо получить то, что метод вернет, для этого я так понимаю надо использовать callBack?

Добавлено через 27 минут
К примеру написал так:
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
public delegate string AsyncMethodCaller(string param);
 
        AsyncMethodCaller caller = new AsyncMethodCaller(Method);
 
 
        
 
        public override void Open(string param)
        {
            SaveToLog(0, "Open");
            //throw new NotImplementedException();
        }
 
        public override string Method(string param)
        {
            SaveToLog(0, param);
            string str = null;
            try
            {
                str = SendExternalRequest(param);
            }
            catch (Exception)
            {
 
            }
            //throw new NotImplementedException();
            return str;
        }
В итоге ошибка - Для нестатического поля, метода или свойства "IBP.ExternalLibrary.ExternalLib.Method( string)" требуется ссылка на объект
изменить на static не могу, так как
C#
1
Method
вызывает другой метод
C#
1
SendExternalRequest
супер класса, и он защищен, и если я изменю на static, то ошибка будет уже в ссылке на
C#
1
SendExternalRequest
возможно я несу чушь, но я не особо силен в C#

Добавлено через 38 минут
Получилось вот так:
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
public delegate string AsyncMethodCaller(string param);
        AsyncMethodCaller caller;
 
 
        
 
        public override void Open(string param)
        {
            //SaveToLog(0, "Open");
            //throw new NotImplementedException();
            caller = new AsyncMethodCaller(SendExternalRequest);
            int dummy = 0;
        }
 
 
        static void CallbackMethod(IAsyncResult ar)
        {
            // Retrieve the delegate.
            AsyncResult result = (AsyncResult)ar;
            AsyncMethodCaller caller = (AsyncMethodCaller)result.AsyncDelegate;
 
            // Retrieve the format string that was passed as state 
            // information.
            string formatString = (string)ar.AsyncState;
 
            // Define a variable to receive the value of the out parameter.
            // If the parameter were ref rather than out then it would have to
            // be a class-level field so it could also be passed to BeginInvoke.
            int threadId = 0;
 
            // Call EndInvoke to retrieve the results.
            string returnValue = caller.EndInvoke(ar);
            //return returnValue;
            // Use the format string to format the output message.
            //Console.WriteLine(formatString, threadId, returnValue);
        }
 
 
        public override string Method(string param)
        {
            IAsyncResult result = caller.BeginInvoke(param, new AsyncCallback(CallbackMethod), null);
            SaveToLog(0, param);
            string str = null;
            try
            {
                str = SendExternalRequest(param);
            }
            catch (Exception)
            {
 
            }
            //throw new NotImplementedException();
            return str;
        }
Подскажите как мне получить значение, которое возвращает метод
C#
1
SendExternalRequest
Добавлено через 15 часов 14 минут
Доброе утро всем! Подскажите по примеру, прошу =)

Код;
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
namespace Examples.AdvancedProgramming.AsynchronousOperations
{
    public class AsyncMain
    {
        // The method to be executed asynchronously.
        static string TestMethod(string param)
        {
            Console.WriteLine("Test method begins.");
            return String.Format("ПРИВЕТ");
        }
 
        public delegate string AsyncMethodCaller(string param);
 
        static void Main()
        {
            AsyncMethodCaller caller = new AsyncMethodCaller(TestMethod);
            int dummy = 0;
            IAsyncResult result = caller.BeginInvoke("ПРИВЕТ",
                new AsyncCallback(CallbackMethod), null);
 
            Console.WriteLine("The main thread {0} continues to execute...",
                Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(4000);
            Console.WriteLine("The main thread ends.");
        }
        static void CallbackMethod(IAsyncResult ar)
        {
            AsyncResult result = (AsyncResult)ar;
            AsyncMethodCaller caller = (AsyncMethodCaller)result.AsyncDelegate;
            string formatString = (string)ar.AsyncState;
            int threadId = 0;
            string returnValue = caller.EndInvoke(ar);
            Console.WriteLine(returnValue);
        }
    }
}
Как мне получить строку "ПРИВЕТ" из callBackMethod в виде переменной, а не в консоль?
Заранее спасибо!
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.07.2013, 12:11
ichgo, плохо, что у вас фреймворк 2.х Ничего с этим нельзя поделать?
0
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
02.07.2013, 13:07  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
ichgo, плохо, что у вас фреймворк 2.х Ничего с этим нельзя поделать?
К сожалению нет, но я точно знаю, что в других библиотеках есть асинхронный вызов с callBack-ом, с помощью которого я получал данные из кода action script, но вот только dll-ки не декомпилируются =(
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.07.2013, 13:10
ichgo, логично, что можно в тьюринг-полном языке можно что угодно сделать, вопрос в затратах. Поэтому "где-то есть" не показатель

К сожалению не могу помочь, т.к. с фреймворком ниже 3.5 никогда не имел дела.

Могу посоветовать только на англоязычном msdn продублировать вопрос - скорее всего ответят.
0
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
02.07.2013, 13:24  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Могу посоветовать только на англоязычном msdn продублировать вопрос - скорее всего ответят.
Спасибо
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
02.07.2013, 21:45
Ну вы что, там же ничего сложного. В самом простом случае:
1. Создать делегат.
2. Запустить асинхронную операцию.
3. Выполнить операции в вызывающем потоке.
4. Завершить асинхронную операцию.
И все работает в .NET2.
Вот пример:
Кликните здесь для просмотра всего текста
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Делегат с подписью, как у вызываемого асинхронно метода.
public delegate string AsyncMethodCaller(string strIn, out string strOut);
 
public class MyClass
{
    // Синхронный метод, который будем выполнять асинхронно.
    public string SyncMethod(string strIn, out string strOut)
    {
        string strRet = null;
 
        for (int i = strIn.Length - 1; i >= 0; --i)
        {
            strRet += Char.ToUpper(strIn[i]);
 
            // Небольшая задержка (для наглядности).
            Thread.Sleep(200);
        }
        strOut = strRet.ToLower();
 
        return strRet;
    }
}
 
public class Program
{
    public static void Main()
    {
        MyClass myClass = new MyClass();
        string strIn = null;
        string strOut = null;
        string strRet = null;
 
        for (char ch = 'z'; ch >= 'a'; --ch) { strIn += ch; }
 
        // Создаем делегат.
        AsyncMethodCaller methodDelegate = new AsyncMethodCaller(myClass.SyncMethod);
        // Запускаем асинхронную операцию - myClass.SyncMethod будет выполняться в другом потоке.
        IAsyncResult result = methodDelegate.BeginInvoke(strIn, out strOut, null, null);
 
        // Теперь в этом вызывающем потоке можно выполнять какую-то работу,
        // в то время как метод myClass.SyncMethod выполняет свою работу асинхронно.
 
        Console.Write("The caller thread no sleep  ");
 
        char[] c = {'-', '/', '|', '\\'};
        int i = 0;
        int p = Console.CursorLeft;
 
        // Так можно узнать выполнена ли асинхронная операция. 
        while (!result.IsCompleted)
        {
            // Небольшая задержка (для наглядности).
            // Здесь можно было и Sleep поставить, WaitOne не несет какого-либо особого смысла.
            // Это просто еще один способ ожидания завершения асинхронной операции, который
            // блокирует вызывающий поток и позволяет указать время ожидания от 0 до бесконечности.
            // Ожидаем завершения асинхронной операции 1 мс и продолжаем что-то делать.
            result.AsyncWaitHandle.WaitOne(100, true);
 
            Console.CursorLeft = p;
            Console.Write(c[i++]);
            i %= 4;
        }
 
        // В реальном случае, когда нам понадобилсь бы данные из вызванного асинхронно метода,
        // т.е. когда всю полезную работу в вызывающем потоке мы уже сделали, мы могли бы ожидать
        // завершения асинхронной операции здесь при помощи вызова EndInvoke или WaitOne.
        // Оба вызова блокируют вызывающий поток, пока не завершится асинхронная операция.
 
        // Завершаение асинхронной операции, получаем возвращаемое и выходное значения.
        strRet = methodDelegate.EndInvoke(out strOut, result);
 
        Console.WriteLine();
        Console.WriteLine("StrIn : " + strIn);
        Console.WriteLine("StrRet: " + strRet);
        Console.WriteLine("StrOut: " + strOut);
    }
}
2
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
04.07.2013, 10:18  [ТС]
Спасибо, судя по всему, что бы получить ответ от метода запущенного асинхронно, нам все же надо блокировать вызывающий поток, и скорее всего интерфейс зависнет, мне надо копать в сторону callback?

Добавлено через 21 час 42 минуты
Добрый день!
Кое как разобрался с тем, как вернуть результат.
Подскажите пожалуйста, можно ли запустить
C#
1
НЕ
статический метод в новом потоке? у меня не поучается, выдает ошибку:
Ошибка 11 Наиболее подходящий перегруженный метод для "System.Threading.Thread.Thread(System.T hreading.ParameterizedThreadStart)" имеет несколько недопустимых аргументов

Вот кот:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public void sendQuery(string param)
        {
            string str = null;
            //System.Threading.Thread.Sleep(1000);
            str = Request(param);
            СodeReceived(str);
        }
public override string Method(string param)
        {
            var t = new Thread(sendQuery) { IsBackground = true };
            return "";  
        }
Добавлено через 27 минут
Разобрался =)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 11:51
ichgo, ну вы пишите, как разобрались, мало ли у кого будет похожая проблема. В этом и смысл форумов. А когда гуглишь ответ и везде написано "разобрался" - хочется что-нибудь в окно выкинуть
0
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
04.07.2013, 11:56  [ТС]
Собирался написать, работа навалилась.
В общем проблема была в том, что метод который я пытался запустить имел обязательный параметр, а не из-за того что он статический, создал переменную вместо обязательного параметра.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public string query;
public string answer;
public void sendQuery()
        {
            string str = null;
            //System.Threading.Thread.Sleep(1000);
            answer = Request(query);
            СodeReceived(answer);
        }
public override string Method(string param)
        {
            query = param;
            var t = new Thread(sendQuery) { IsBackground = true };
            return "";  
        }
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 11:59
ichgo, можно иметь параметр, просто перед запуском потока нужно писать:
http://msdn.microsoft.com/ru-r... c42hc.aspx
1
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
05.07.2013, 10:06  [ТС]
А можете подсказать, поток который я создаю в коде выше, сам закроется после выполнения метода SendQuery? Или его надо самому закрывать, а то интерфейс виснет, как-будто ждет чего-то =)
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.07.2013, 10:13
Цитата Сообщение от ichgo Посмотреть сообщение
сам закроется после выполнения метода SendQuery?
Поток сам завершится. Что вы подразумеваете под термином закроется по отношению к потокам?
1
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
05.07.2013, 10:33  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Поток сам завершится. Что вы подразумеваете под термином закроется по отношению к потокам?
Я имелл ввиду именно "завершится", спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.07.2013, 10:33
Помогаю со студенческими работами здесь

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет метод А, класс2 имеет метод Б, класс1...

Вызов переменной метода A из метода В
Добрый день. Подскажите как происходит вызов Например даны два класс А и В, в каждом классе есть Метод 1 и метод 2 class A { void...

вызов метода
Добрый день, подскажите пожалуйста почему при вызове метода pole из конструктора картинка не отображается, а если вызвать этот же метод по...

Наследование и вызов метода
есть базовый класс и класс потомок. class a { protected int a; protected int b; public a() { a=0; b = 0; }

Вызов метода по тексту
Всем привет, не нашел информации. подскажите возможно ли вызвать по тексту. Для примера объясню в TreeView у меня есть несколько узлов, и...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru