Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
chaleureux
17 / 20 / 19
Регистрация: 24.12.2014
Сообщений: 973
#1

Многопоточность из класса - C#

07.11.2016, 14:18. Просмотров 373. Ответов 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
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
using System;
using System.Management;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
 
 
static class HardwareInfo
{
    static public string GetKey(bool bind_to_windows = !true)
    {
        var info = string.Join("|",
                GetProcessorId(),
                GetHDDSerialNo(),
                GetMACAddress(),
                GetBoardMaker(),
                GetBoardProductId(),
                GetBIOSmaker(),
                GetBIOSserNo(),
                GetBIOScaption(),
                GetPhysicalMemory(),
                GetNoRamSlots(),
                GetCPUManufacturer(),
                GetProcessorInformation()
 
        );
 
        if (bind_to_windows)
            info += '|' + string.Join("|",
                    GetOSInformation(),
                    GetAccountName(),
                    GetComputerName()
                    );
 
        var ByteResult = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(info));
        string StringResult = string.Empty;
        foreach (byte b in ByteResult)
            StringResult += String.Format("{0:x2}", b).ToUpper();
        Regex regex = new Regex(@"(\w{1,8})");
        var Matches = regex.Matches(StringResult);
        string[] MsResult = new string[Matches.Count];
        for (int i = 0; i < Matches.Count; i++)
            MsResult[i] = Matches[i].Groups[1].Value;
 
        return string.Join("-", MsResult);
       // info = (Math.Pow(info.GetHashCode(), 5)) .ToString();
    }
    static String GetProcessorId()
    {
        ManagementClass mc = new ManagementClass("win32_processor");
        ManagementObjectCollection moc = mc.GetInstances();
        String Id = String.Empty;
        foreach (ManagementObject mo in moc)
        {
            Id = mo.Properties["processorID"].Value.ToString();
            break;
        }
        return Id;
    } 
    static String GetHDDSerialNo()
    {
        ManagementClass mangnmt = new ManagementClass("Win32_LogicalDisk");
        ManagementObjectCollection mcol = mangnmt.GetInstances();
        string result = "";
        foreach (ManagementObject strt in mcol)
        {
            result += Convert.ToString(strt["VolumeSerialNumber"]);
        }
        return result;
    }
    static string GetMACAddress()
    {
        ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
        ManagementObjectCollection moc = mc.GetInstances();
        string MACAddress = String.Empty;
        foreach (ManagementObject mo in moc)
        {
            if (MACAddress == String.Empty)
            {
                if ((bool)mo["IPEnabled"] == true) MACAddress = mo["MacAddress"].ToString();
            }
            mo.Dispose();
        }
 
        MACAddress = MACAddress.Replace(":", "");
        return MACAddress;
    }
    static string GetBoardMaker()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BaseBoard");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Manufacturer").ToString();
            }
            catch { }
        }
        return "Board Maker: Unknown";
    }
    static string GetBoardProductId()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BaseBoard");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Product").ToString();
            }
            catch { }
        }
        return "Product: Unknown";
    }
    static string GetCdRomDrive()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_CDROMDrive");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Drive").ToString();
            }
            catch { }
        }
       return "CD ROM Drive Letter: Unknown";
    }
    static string GetBIOSmaker()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BIOS");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Manufacturer").ToString();
            }
            catch { }
        }
        return "BIOS Maker: Unknown";
    }
    static string GetBIOSserNo()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BIOS");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("SerialNumber").ToString();
            }
            catch { }
        }
        return "BIOS Serial Number: Unknown";
    }
    static string GetBIOScaption()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_BIOS");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Caption").ToString();
            }
            catch { }
        }
        return "BIOS Caption: Unknown";
    }
    static string GetAccountName()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_UserAccount");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return wmi.GetPropertyValue("Name").ToString();
            }
            catch { }
        }
        return "User Account Name: Unknown";
    }
    static string GetPhysicalMemory()
    {
        ManagementScope oMs = new ManagementScope();
        ObjectQuery oQuery = new ObjectQuery("SELECT Capacity FROM Win32_PhysicalMemory");
        ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery);
        ManagementObjectCollection oCollection = oSearcher.Get();
        long MemSize = 0;
        long mCap = 0;
        foreach (ManagementObject obj in oCollection)
        {
            mCap = Convert.ToInt64(obj["Capacity"]);
            MemSize += mCap;
        }
        MemSize = (MemSize / 1024) / 1024;
        return MemSize.ToString() + "MB";
    }
    static string GetNoRamSlots()
    {
        int MemSlots = 0;
        ManagementScope oMs = new ManagementScope();
        ObjectQuery oQuery2 = new ObjectQuery("SELECT MemoryDevices FROM Win32_PhysicalMemoryArray");
        ManagementObjectSearcher oSearcher2 = new ManagementObjectSearcher(oMs, oQuery2);
        ManagementObjectCollection oCollection2 = oSearcher2.Get();
        foreach (ManagementObject obj in oCollection2)
        {
            MemSlots = Convert.ToInt32(obj["MemoryDevices"]);
        }
        return MemSlots.ToString();
    }
    static string GetCPUManufacturer()
    {
        string cpuMan = String.Empty;
        //create an instance of the Managemnet class with the
        //Win32_Processor class
        ManagementClass mgmt = new ManagementClass("Win32_Processor");
        //create a ManagementObjectCollection to loop through
        ManagementObjectCollection objCol = mgmt.GetInstances();
        //start our loop for all processors found
        foreach (ManagementObject obj in objCol)
        {
            if (cpuMan == String.Empty)
            {
                // only return manufacturer from first CPU
                cpuMan = obj.Properties["Manufacturer"].Value.ToString();
            }
        }
        return cpuMan;
    }
    static string GetDefaultIPGateway()
    {
        //create out management class object using the
        //Win32_NetworkAdapterConfiguration class to get the attributes
        //of the network adapter
        ManagementClass mgmt = new ManagementClass("Win32_NetworkAdapterConfiguration");
        //create our ManagementObjectCollection to get the attributes with
        ManagementObjectCollection objCol = mgmt.GetInstances();
        string gateway = String.Empty;
        //loop through all the objects we find
        foreach (ManagementObject obj in objCol)
        {
            if (gateway == String.Empty)  // only return MAC Address from first card
            {
                //grab the value from the first network adapter we find
                //you can change the string to an array and get all
                //network adapters found as well
                //check to see if the adapter's IPEnabled
                //equals true
                if ((bool)obj["IPEnabled"] == true)
                {
                    gateway = obj["DefaultIPGateway"].ToString();
                }
            }
            //dispose of our object
            obj.Dispose();
        }
        //replace the ":" with an empty space, this could also
        //be removed if you wish
        gateway = gateway.Replace(":", "");
        //return the mac address
        return gateway;
    }
    static string GetOSInformation()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
        foreach (ManagementObject wmi in searcher.Get())
        {
            try
            {
                return ((string)wmi["Caption"]).Trim() + ", " + (string)wmi["Version"] + ", " + (string)wmi["OSArchitecture"];
            }
            catch { }
        }
        return "BIOS Maker: Unknown";
    }
    static String GetProcessorInformation()
    {
        ManagementClass mc = new ManagementClass("win32_processor");
        ManagementObjectCollection moc = mc.GetInstances();
        String info = String.Empty;
        foreach (ManagementObject mo in moc)
        {
            string name = (string)mo["Name"];
            name = name.Replace("(TM)", "™").Replace("(tm)", "™").Replace("(R)", "®").Replace("(r)", "®").Replace("(C)", "©").Replace("(c)", "©").Replace("    ", " ").Replace("  ", " ");
 
            info = name + ", " + (string)mo["Caption"] + ", " + (string)mo["SocketDesignation"];
            //mo.Properties["Name"].Value.ToString();
            //break;
        }
        return info;
    }
    static String GetComputerName()
    {
        ManagementClass mc = new ManagementClass("Win32_ComputerSystem");
        ManagementObjectCollection moc = mc.GetInstances();
        String info = String.Empty;
        foreach (ManagementObject mo in moc)
        {
            info = (string)mo["Name"];
            //mo.Properties["Name"].Value.ToString();
            //break;
        }
        return info;
    }
}
При вызове класса, зависает форма, до появления ключа))
C#
1
HardwareInfo.GetKey();
Как сделать появления ключа при запуске формы? ( Без зависания) !
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2016, 14:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Многопоточность из класса (C#):

Многопоточность в C#
Всем доброго времени суток! Я с толкнулся с проблемой с которой сам никак не...

Многопоточность
Собсно захотел,что бы пакет отправлялся с разных прокси в разных потоках....

Многопоточность
Подскажите очень срочно нужно - сделать многопоточное приложение, в котором...

Многопоточность
Есть такой код: bool i = true; public void statrt() ...

Многопоточность и ЦП
Вызвал метод в контексте 2х вторичных потоков(основной поток + 2 вторичных) и...

Многопоточность
В программе создается поток по обработке данных, его работа занимает приличное...

17
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
07.11.2016, 16:33 #2
Лучший ответ Сообщение было отмечено chaleureux как решение

Решение

C#
1
2
3
4
static public async Task<string> GetKeyAsync(bool bind_to_windows = !true)
{
     return await Task.Factory.StartNew(() => GetKey(bind_to_windows));
}
Вызов:
C#
1
string key = await GetKeyAsync();
Как-то так вроде
1
chaleureux
17 / 20 / 19
Регистрация: 24.12.2014
Сообщений: 973
07.11.2016, 17:55  [ТС] #3
TopLayer, Чёт не катит
C#
1
static public string async Task<string> GetKey(bool bind_to_windows = !true)
HTML5
1
Неявное преобразование типа "string" в "System.Threading.Tasks.Task<string>" невозможно
0
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
07.11.2016, 18:47 #4
chaleureux, ну Вы и не то написали, что я советовал. Я имел ввиду добавить в класс HardwareInfo метод-обёртку для GetKey:
C#
1
2
3
4
static public async Task<string> GetKeyAsync(bool bind_to_windows = !true)
{
     return await Task.Factory.StartNew(() => GetKey(bind_to_windows));
}
0
chaleureux
17 / 20 / 19
Регистрация: 24.12.2014
Сообщений: 973
07.11.2016, 19:49  [ТС] #5
TopLayer, async Он требует класс делегата перечисления, интерфейс или структура)
0
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
07.11.2016, 20:04 #6
chaleureux, выложите код HardwareInfo и Вашей формы
0
chaleureux
17 / 20 / 19
Регистрация: 24.12.2014
Сообщений: 973
07.11.2016, 20:41  [ТС] #7
Ну так выложил же код HardwareInfo ) - Это класс
Ну и просто в Form_Load вызываю:
C#
1
2
3
4
private void Form_Load(object sender, EventArgs e)
        {
           TextBox.Text = HardwareInfo.GetKey();
        }
0
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
07.11.2016, 20:52 #8
Перепишите вот так
C#
1
2
3
4
        private async void Form_Load(object sender, EventArgs e)
        {
           TextBox.Text = await HardwareInfo.GetKeyAsync();
        }
0
chaleureux
17 / 20 / 19
Регистрация: 24.12.2014
Сообщений: 973
07.11.2016, 20:55  [ТС] #9
TopLayer, Окей) А как быть с классом, я не могу присвоить ему:
C#
1
static public async Task<string> GetKeyAsync(bool bind_to_windows = !true)
Если у Вас работает, выложите проект! А то чёт не ахти
0
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
07.11.2016, 21:08 #10
Цитата Сообщение от chaleureux Посмотреть сообщение
Ну так выложил же код HardwareInfo ) - Это класс
Я имел ввиду после правок, которые привели к ошибке компиляции

Добавлено через 11 минут
Вот, надеюсь сможете спроецировать на Ваш проект.
Кликните здесь для просмотра всего текста
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
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Test
{
    class MainForm: Form
    {
        public MainForm()
        {
            this.Load += MainForm_Load;
        }
 
        private async void MainForm_Load(object sender, System.EventArgs e)
        {
            this.Text = await HardwareInfo.GetKeyAsync();
        }
 
        [STAThread]
        static void Main()
        {
            Application.Run(new MainForm());
        }
    }
 
    static class HardwareInfo
    {
        public static async Task<string> GetKeyAsync(bool bind_to_windows = !true)
        {
            return await Task.Factory.StartNew(() => GetKey());
        }
 
        private static double temp;
        public static string GetKey()
        {
 
            for (var i = 0; i < 1000*1000*1000; ++i) // Типо долго вычисляем ключ
                temp += i/200000000.0;
            return "KEY";
        }
    }
}
0
chaleureux
17 / 20 / 19
Регистрация: 24.12.2014
Сообщений: 973
07.11.2016, 21:15  [ТС] #11
У меня всё ровно не выходит чё-то, может лучше будет если я скину сам класс, а Вы смогёте его переделать?!)
0
Вложения
Тип файла: rar HardwareInfo.rar (2.3 Кб, 1 просмотров)
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
07.11.2016, 21:23 #12
Так вы проект скидывайте а не 1 файл !!!
0
chaleureux
17 / 20 / 19
Регистрация: 24.12.2014
Сообщений: 973
07.11.2016, 21:30  [ТС] #13
Ну как бы вот проект!
0
Вложения
Тип файла: rar TheBestKey.rar (49.9 Кб, 1 просмотров)
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
07.11.2016, 21:58 #14
chaleureux, Это необходимо, чтобы проект был под Net framework 4 client profile?

Добавлено через 3 минуты
Хотя неважно. Замените код формы на этот.
Кликните здесь для просмотра всего текста
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
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace TheBestKey
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Task.Factory.StartNew(() => HardwareInfo.GetKey())
                .ContinueWith(t =>
                {
                    this.BeginInvoke(new Action(() =>
                    {
                        textBox1.Text = t.Result;
                    }));
                });
        }
    }
}
0
chaleureux
17 / 20 / 19
Регистрация: 24.12.2014
Сообщений: 973
07.11.2016, 22:17  [ТС] #15
При запуске ничего не происходит!
После закрытия выскакивает исключение!
HTML5
1
Была предпринята попытка освободить RCW, находящийся в использовании.  RCW используется активным потоком или другим потоком.  Попытка освободить RCW, находящийся в использовании, может привести к повреждению или потере данных.
0
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
07.11.2016, 22:48 #16
chaleureux, ну тут нужны какие-то специализированные знания. У меня на компьютере всё отлично работает.
Вряд ли я смогу помочь...

Добавлено через 10 минут
Цитата Сообщение от chaleureux Посмотреть сообщение
При запуске ничего не происходит!
Дебажьте метод GetKey

Добавлено через 14 минут
До правок форма надолго зависала?
0
chaleureux
17 / 20 / 19
Регистрация: 24.12.2014
Сообщений: 973
07.11.2016, 22:49  [ТС] #17
Цитата Сообщение от TopLayer Посмотреть сообщение
До правок форма надолго зависала?
секунд 5
0
TopLayer
725 / 548 / 290
Регистрация: 23.10.2016
Сообщений: 1,286
Завершенные тесты: 7
07.11.2016, 22:51 #18
Если в моей версии результат долго не отображается это значит, что метод GetKey долго работает. Убедитесь с помощью дебагера, что этот метод нормально выполняется. А если нет - то на каком этапе он виснет.
0
07.11.2016, 22:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2016, 22:51
Привет! Вот еще темы с решениями:

Многопоточность
Есть массив, заполненный случайными числами, на 500 элементов.Есть textBox1 и...

многопоточность
Привет подскажите возможно ли отслеживать проникновение посторонних программ...

Многопоточность
Как сделать много поточность? т.е. 1 поток отвечает за отправку запроса на...

ParameterizedThreadStart в многопоточность
вот так передаю параметры в поток, а как сделать что бы считывать из потока...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru