C нет перегруженного метода который соответствует делегату
В предыдущей статье было рассмотрено, как запускать в отдельных потоках методы без параметров. А что, если нам надо передать какие-нибудь параметры в поток?
Для этой цели используется делегат ParameterizedThreadStart , который передается в конструктор класса Thread:
public delegate void ParameterizedThreadStart(object? obj);
Применение делегата ParameterizedThreadStart во многом похоже на работу с ThreadStart . Рассмотрим на примере:
using System.Threading; // создаем новые потоки Thread myThread1 = new Thread(new ParameterizedThreadStart(Print)); Thread myThread2 = new Thread(Print); Thread myThread3 = new Thread(message => Console.WriteLine(message)); // запускаем потоки myThread1.Start("Hello"); myThread2.Start("Привет"); myThread3.Start("Salut"); void Print(object? message) => Console.WriteLine(message);
При создании потока в конструктор класса Thread передается объект делегата ParameterizedThreadStart new Thread(new ParameterizedThreadStart(Print)) , либо непосредственно метод, который соответствует этому делегату ( new Thread(Print) ), в том числе в виде лямбда-выражения ( new Thread(message => Console.WriteLine(message)) )
Затем при запуске потока в метод Start() передается значение, которое передается параметру метода Print. И в данном случае мы получим следующий консольный вывод:
Salut Hello Привет
При использовании ParameterizedThreadStart мы сталкиваемся с ограничением: мы можем запускать во втором потоке только такой метод, который в качестве единственного параметра принимает объект типа object? . Поэтому если мы хотим использовать данные других типов, в самом методе необходимо выполнить приведение типов. Например:
using System.Threading; int number = 4; // создаем новый поток Thread myThread = new Thread(Print); myThread.Start(number); // n * n = 16 // действия, выполняемые во втором потокке void Print(object? obj) < // здесь мы ожидаем получить число if (obj is int n) < Console.WriteLine($"n * n = "); > >
в данном случае нам надо дополнительно привести переданное значение к типу int, чтобы его использовать в вычислениях.
Но что делать, если нам надо передать не один, а несколько параметров различного типа? В этом случае можно определить свои типы:
using System.Threading; Person tom = new Person("Tom", 37); // создаем новый поток Thread myThread = new Thread(Print); myThread.Start(tom); void Print(object? obj) < // здесь мы ожидаем получить объект Person if (obj is Person person) < Console.WriteLine($"Name = "); Console.WriteLine($"Age = "); > > record class Person(string Name, int Age);
Сначала определяем специальный класс Person, объект которого будет передаваться во второй поток, а в методе Main передаем его во второй поток.
Но тут опять же есть одно ограничение: метод Thread.Start не является типобезопасным, то есть мы можем передать в него любой тип, и потом нам придется приводить переданный объект к нужному нам типу. Для решения данной проблемы рекомендуется объявлять все используемые методы и переменные в специальном классе, а в основной программе запускать поток через ThreadStart. Например:
using System.Threading; Person tom = new Person("Tom", 37); // создаем новый поток Thread myThread = new Thread(tom.Print); myThread.Start(); record class Person(string Name, int Age) < public void Print() < Console.WriteLine($"Name = "); Console.WriteLine($"Age = "); > >
C нет перегруженного метода который соответствует делегату
в чем ошибка компиляции??
Добавлено 08.03.11, 14:35
В идеале он должен менять местами поля Text кнопок, если в одном из полей пустая строка и если имя кнопки с которой предстоит обмен button15 или button12.
Вы че это на каждую кнопку вешаете свой код для смены??
Сообщ. #3 , 08.03.11, 14:35
Unregistered
Не удалось найти имя типа или пространства имён «EventHandler»
Добавлено 08.03.11, 14:37
Да, я не знаю как автоматизировать то, чтобы обмен разрешался только соседним кнопкам. Их в принципе всего 16 — так что это не большая проблема.
Сообщ. #4 , 08.03.11, 14:39

Рейтинг (т): 202
using System;
Сообщение отредактировано: maxim84_ — 08.03.11, 14:40
Сообщ. #5 , 08.03.11, 14:49
Unregistered
есть.
на другом форуме говорят, что это из-за
private void button17_Click(object sender, EventArgs e, Button _b)
Что надо Butto_b убрать. А где его тогда объявить?
Сообщ. #6 , 08.03.11, 14:56

Рейтинг (т): 202
конечно убрать. нет такого эвента
Что куда передать?? для чего этот аргумент вообще?
Добавлено 08.03.11, 15:02
ужасть ))
у вообще у контролов есть такая штука как Tag, он имеет тип object, а значит туда можно затолкать все что угодно, и использовать в наших целях. Итак:
всем кнопка программно задаем индекс в свойство Tag и попутно подсовываем обработчик нажатия:
Saved searches
Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Source code for Emotion detection with Face API (cloud) #3
ArtyomR opened this issue Jun 18, 2018 · 2 comments
Source code for Emotion detection with Face API (cloud) #3
ArtyomR opened this issue Jun 18, 2018 · 2 comments
Comments
ArtyomR commented Jun 18, 2018
I passed all recommended stapes. But the app doesn’t work. There are 2 error and 3 warrning messages.
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка CS0246 Не удалось найти тип или имя пространства имен «FrameEventArgs» (возможно, отсутствует директива using или ссылка на сборку). AlarmClock C:\Users\ArtemRadchenko\source\repos\AlarmClock\AlarmClock\MainPage.xaml.cs 63 Активный
Ошибка CS0123 Нет перегруженного метода для «Preview_FrameArrived», который соответствует делегату «EventHandler». AlarmClock C:\Users\ArtemRadchenko\source\repos\AlarmClock\AlarmClock\MainPage.xaml.cs 58 Активный
Предупреждение NU1603 runtime.native.System.IO.Compression 4.3.0 зависит от runtime.win10-arm64.runtime.native.System.IO.Compression (>= 4.3.0), но runtime.win10-arm64.runtime.native.System.IO.Compression 4.3.0 не найден. Использовано наилучшее приближенное соответствие runtime.win10-arm64.runtime.native.System.IO.Compression 4.3.1.
Предупреждение CS1998 В данном асинхронном методе отсутствуют операторы await, поэтому метод будет выполняться синхронно. Воспользуйтесь оператором await для ожидания неблокирующих вызовов API или оператором await Task.Run(. ) для выполнения связанных с ЦП заданий в фоновом потоке. AlarmClock C:\Users\ArtemRadchenko\source\repos\AlarmClock\AlarmClock\MainPage.xaml.cs 63 Активный
Предупреждение CS0168 Переменная «e» объявлена, но ни разу не использована. AlarmClock C:\Users\ArtemRadchenko\source\repos\AlarmClock\AlarmClock\MainPage.xaml.cs 112 Активный
Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.
- ID: 3d47c1f9-0c11-727e-1ac9-14d03a67264f
- Version Independent ID: 5a701b6d-48c7-a78d-b081-2384e981c2ac
- Content: Get started with Machine Learning
- Content Source: labs/insiderdevtour2018/machinelearning/index.yml
- GitHub Login: @cbarkerms
The text was updated successfully, but these errors were encountered:
Нет перегруженного метода, который соответствует делегату
Что делать? — для начала указать что за ошибка и почему вы думаете, что каллбек для таймера вдруг будет принимать строку как параметр.
25 авг 2018 в 11:00
Нет перегруженного метода для «Switch», который соответствует делегату «TimerCallback»
25 авг 2018 в 11:12
Ну то есть вам прямо текстом написано что не так — сигнатура вашего Switch не совпадает с тем, что ожидает каллбек таймера. Согласно докам метод должен быть void и принимать параметр как object , а у вас вместо объекта — строка.
25 авг 2018 в 11:30
да и логика вашего Switch непонятна — почему вы решили, что таймер, которому дела нет до каких то команд, вдруг начнет посылать команды в метод Switch ? Он этого делать сам не будет, вам надо писать какую то доп логику для того, чтобы в ваш метод посылались команды, что вы хотите
25 авг 2018 в 11:32
ну тогда вам нужен метод, что принимает object как параметр (а уже в этом методе вызывайте что хотите) + вам надо будет сделать таймер полем класса, иначе GC его уничтожит. И это вроде все, что вам необходимо для решения вашей задачи.