Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/50: Рейтинг темы: голосов - 50, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 59

Потоки. Возвращение значения

03.04.2013, 21:57. Показов 9612. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть библиотека классов. Там не статический класс, в нем, очевидно, не статические методы. В методе Main я создаю экземпляр этого класса. Затем вызываю метод, который что-то там считает и возвращает значение.
C#
1
2
3
4
...
Class1 obj = new Class1(a, b, c);
BigInteger x = obj.Go()
...;
А вот код из библиотеки классов.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Class1
    {
public class1(BigInteger x, BigInteger y, BigInteger z)// Конструктор.
        {
            ...
        }
public BigInteger Go()
        {
            // тут вызывается куча методов из этого класса. Что-то там считается и возвращает значение.
            ...
            return a; //Возвращаем в итоге переменную BigInteger.
        }
}
Нужно запустить это не в основном потоке, иначе программа не отвечает и тупой юзер её может закрыть.
В потоках не очень разбираюсь. Только начал их изучать. Подскажите пожалуйста как это сделать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2013, 21:57
Ответы с готовыми решениями:

Потоки и возвращение значения
Добрый день. Столкнулся с проблемой при написании многопоточного приложения. А именно-как получить результат работы метода, который...

C# поиск в файле и возвращение значения
Есть файл, с примерно таким содержанием: "items" { "4228" {

Возвращение значения из ComboBox в базу данных
как вернуть значение id в базу из combobox'a в котором отображаются названия категорий заполнение combobox'a try ...

46
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
03.04.2013, 22:19
C#
1
2
3
Class1 obj = new Class1(a, b, c);
BigInteger someDec = 0;
 new Tthread((someObject)=>{ someDec = (Class1)someObject.GO();}).Start(obj);
Добавлено через 3 минуты
мм, не получится.

Добавлено через 33 секунды
void - возвращаемое значение должно быть. сейчас
1
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 59
03.04.2013, 22:27  [ТС]
Как возвращаемое значение может быть void ? Значение или не войдом возвращается или модификаторами реф\аут.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
03.04.2013, 22:54
В классе определить:
C#
1
Func<BigInteger> someDel;
Затем вот так:
C#
1
2
3
4
5
6
7
 SomeClass cl = new SomeClass();
             someDel = new Func<BigInteger>(cl.GO);
             IAsyncResult result  = someDel.BeginInvoke(null, null);
            // здесь некоторая ваша логика. 
            // ...
            // ...
             BigInteger someInteger = someDel.EndInvoke(result);
Имел ввиду, что для предыдущего способа нужно было чтобы метод void возвращал.

Добавлено через 1 минуту
EndInvoke нужно вызывать, если уверены что операция завершилась.
Сейчас уточню.

Добавлено через 12 минут
Вот так лучше: Определить метод обратного вызова в классе.
C#
1
2
3
4
5
private void CallBack(IAsyncResult result)
         {
             someDel.EndInvoke(result);     
         
         }
и вызывать вот так:
C#
1
someDel.BeginInvoke(new AsyncCallback(CallBack),null);
Теперь ваш вызывающий поток гарантировано не будет блокироваться.

Добавлено через 5 минут
Блин, нерабочий вариант, , значение то вернуть надо.
1
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 59
03.04.2013, 22:56  [ТС]
ага, я вот тоже сижу, думаю как это так работает
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
03.04.2013, 23:04
сейчас доделаю. Просто в асинках опыта нет.

Добавлено через 4 минуты
Как вариант, объявить в классе поле типа BigInteger и в методе обратного вызова:
C#
1
yourFieldInYourClass = someDel.EndInvoke(result);
Добавлено через 3 минуты
либо возвращаемое значение передавать в метод out параметром, так проще будет.
Просто не в курсе, как локальный объект передать в метод обратного вызова.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.04.2013, 02:00
Denmarino, если есть возможность юзать C# 5, то все еще проще:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Class1
    {
public class1(BigInteger x, BigInteger y, BigInteger z)// Конструктор.
        {
            ...
            var somevalue = await Go();
        }
public async BigInteger Go()
        {
            // тут вызывается куча методов из этого класса. Что-то там считается и возвращает значение.
            ...
            return a; //Возвращаем в итоге переменную BigInteger.
        }
0
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 59
04.04.2013, 17:51  [ТС]
у меня 2010VS
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
04.04.2013, 18:09
Сделайте отдельный класс, в котором и из которого все будете получать/передавать.
C#
1
2
3
4
5
6
7
8
9
10
11
public class MyThread  {
   private Class1 myval;
   public MyThread(Class1 myval) {
      this.myval = myval;
   }
 
   public BigInteger GoResult;
   public void MyThreadProc() {
      GoResult = myval.Go();
   }
}
C#
1
2
3
MyThread v = new MyThread(obj);
Thread t = new Thread(v.MyThreadProc);
t.Start();
1
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 59
04.04.2013, 18:56  [ТС]
Всё равно не возвращает почему-то.

Добавлено через 2 минуты
C#
1
2
3
4
MyThread v = new MyThread(obj);
            Thread t = new Thread(v.MyThreadProc);
            t.Start();
            x = v.GoResult;
Если с отладкой запускать, то видно, что x = 0 после выполнения в потоке уже
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
04.04.2013, 19:06
Так вы только запустили поток.
Если вы хотите подождать его завершения и получить результат, то надо вызвать метод Thread.Join.
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
04.04.2013, 19:08
turbanoff, Так главная цель ТС - оставить вызывающий поток в рабочем состоянии.
1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
04.04.2013, 19:10
Тогда зачем он пытается получить результат, если поток еще не выполнился?
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
04.04.2013, 19:14
Если только для проверки Join можно. Остальная же логика известна только автору.
1
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 59
04.04.2013, 19:35  [ТС]
Ну у меня программа работает с большими числами. И в ВинФормс получается так, что пользователь вводит большие числа, программа начинает считать, считает секунд десять а в это время программа не отвечает и виндоус предлгагает её закрыть. Поэтому я подумал, что если сделать другим потоком, такого не должно быть. Нормально так будет или нет? Или я вообще не то делаю?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
04.04.2013, 19:37
Да, все вы делаете правильно. Просто значение нужно получать не сразу, а тогда, когда фоновый поток завершит выполнение.
1
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 59
04.04.2013, 19:42  [ТС]
И какой это метод вызывать?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
04.04.2013, 19:55
Все известные мне средства синхронизации блокируют вызывающий поток, кроме того что показал вам выше.
Как вариант, можно проверять возвращаемое значение на !=0(если результат не может вернуть 0,конечно), либо смотреть свойство Thread.ThreadState or IsAlive и только тогда вытаскивать значение.

Добавлено через 5 минут
* Да и то по факту в показанном мной способе нет синхронизации, поэтому остается только проверка состояния потока, либо возвращаемого значения
1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
04.04.2013, 20:00
Добавьте в класс MyThread событие, которое будет вызываться по окончании вычислений.
И подписывайтесь на него перед запуском потока.
2
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,231
04.04.2013, 20:01
Точно )
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.04.2013, 20:01
Помогаю со студенческими работами здесь

Возвращение одного значения из базы данных
Допустим пишу SQL запрос SELECT Фамилия FROM Список WHERE ='32' Этим запрсом я верну человека который у меня 32 в списке,так вот...

Возвращение значения null
как поступить в данном случае, при запросе WMI к классу WIN32_Processor посредством L2CacheSize конструктор выдает ошибку о том что...

Потоки и возвращение значения
void main() { //... Thread th_ptr = new Thread(delegate() { fucn(i); }); th_ptr.Start(); int t=//сюда надо записать значение,...

Установка значения трекбара по нажатию кнопки, и последующее возвращение начального значения
В общем проблема вот в чем: Делаю плеер, и нужна кнопка для отключения звука, громкость на 0 то есть, и последующего возвращения...

Возвращение значения из Taska
Коллеги, не могу понять почему при вызове вызов таска из метода кнопки он жалуется, что невозможно ожидание String В чем здесь...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru