Threads in C# // Wieso hängt sich der Hauptthread auf / friert ein

  • C#
  • .NET (FX) 4.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Threads in C# // Wieso hängt sich der Hauptthread auf / friert ein

    Hi.
    Mittlerweile enthält meine Source keine MySQL - Zugangsadaten mehr, ich kann sie hier also reinposten. Das ist das Ergebnis nächtelanger Arbeit, ihc beschäftige mich erst seid 3 Wochen mit dieser Sprache und mir gehts es NOCH nicht um Schönheitsfehler wie Variablennamen, Invoke (gibt ja diese Einstellung) :) und son Zeug.
    Spoiler anzeigen

    C#-Quellcode

    1. using Microsoft.Win32;
    2. using MySql.Data.MySqlClient;
    3. using System;
    4. using System.Collections;
    5. using System.Collections.Generic;
    6. using System.Collections.Specialized;
    7. using System.ComponentModel;
    8. using System.Data;
    9. using System.Diagnostics;
    10. using System.Drawing;
    11. using System.IO;
    12. using System.Linq;
    13. using System.Net;
    14. using System.Text;
    15. using System.Text.RegularExpressions;
    16. using System.Threading;
    17. using System.Threading.Tasks;
    18. using System.Windows.Forms;
    19. namespace WindowsFormsApplication1
    20. {
    21. public partial class Form1 : Form
    22. {
    23. public Form1()
    24. {
    25. InitializeComponent();
    26. }
    27. private void label1_Click(object sender, EventArgs e)
    28. {
    29. }
    30. private void connect()
    31. {
    32. }
    33. private void read(string dn, List<string> dp, List<string> dns, List<string> ver, List<string> link, List<string> updnec, List<string> dv, string bitos, string dnsss, string updnecls)
    34. {
    35. NameValueCollection myNameValueCollection = new NameValueCollection();
    36. WebClient myWebClient = new WebClient();
    37. string response = string.Empty;
    38. bool prgAcc = new bool();
    39. if (Environment.Is64BitOperatingSystem == true)
    40. {
    41. if (dnsss.Contains("Wow6432Node"))
    42. {
    43. bitos = "x86";
    44. }
    45. else
    46. {
    47. bitos = "x64";
    48. }
    49. }
    50. else
    51. {
    52. bitos = "x86";
    53. }
    54. myNameValueCollection.Add("dn", dn + " " + bitos);
    55. //MessageBox.Show(bitos);
    56. byte[] responseArray = myWebClient.UploadValues("http://comptalk.de/cms/iup/version.php", "POST", myNameValueCollection);
    57. response=Encoding.ASCII.GetString(responseArray);
    58. if (response != null)
    59. {
    60. ver.Add(response);
    61. foreach (string dvss in dv)
    62. {
    63. //MessageBox.Show("Wichtig:" + dvss);
    64. int dvsss = int.Parse(dvss.Replace(".", ""));
    65. int dvsssss = int.Parse(response.Replace(".", ""));
    66. if (dvsss < dvsssss)
    67. {
    68. updnec.Add(dn);
    69. prgAcc = true;
    70. //MessageBox.Show("Zu UpdateNec wurde hinzugefügt:" + dvsss.ToString() + "<" + dvsssss.ToString());
    71. }
    72. else{
    73. prgAcc = false;
    74. //MessageBox.Show("Zu UpdateNec wurde nicht hinzugefügt:" + dvsss.ToString() + "<" + dvsssss.ToString());
    75. }
    76. }
    77. }
    78. responseArray = myWebClient.UploadValues("http://comptalk.de/cms/iup/link.php", "POST", myNameValueCollection);
    79. string linkresponse=Encoding.ASCII.GetString(responseArray);
    80. if (linkresponse != null)
    81. {
    82. if (prgAcc == true)
    83. {
    84. link.Add(linkresponse);
    85. }
    86. }
    87. }
    88. private void label2_Click(object sender, EventArgs e)
    89. {
    90. }
    91. private void label3_Click(object sender, EventArgs e)
    92. {
    93. }
    94. private void label5_Click(object sender, EventArgs e)
    95. {
    96. }
    97. private void Form1_Load(object sender, EventArgs e)
    98. {
    99. }
    100. private void label8_Click(object sender, EventArgs e)
    101. {
    102. }
    103. private void progressBar1_Click(object sender, EventArgs e)
    104. {
    105. }
    106. private void button3_Click(object sender, EventArgs e)
    107. {
    108. //connect();
    109. CheckForIllegalCrossThreadCalls = false;
    110. WebClient myWebClient = new WebClient();
    111. string updnecls = string.Empty;
    112. string bitos = string.Empty;
    113. List<string> dp = new List<string>();
    114. RegistryKey localKey =
    115. RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
    116. RegistryView.Registry64);
    117. localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\VLC media player");
    118. if (Environment.Is64BitOperatingSystem == true)
    119. {
    120. if (localKey != null)
    121. {
    122. //MessageBox.Show("Found");
    123. if (localKey.GetValue("DisplayName") != null)
    124. {
    125. dp.Add(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\VLC media player");
    126. }
    127. }
    128. else
    129. {
    130. dp.Add(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\VLC media player");
    131. }
    132. }
    133. else
    134. {
    135. dp.Add(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\VLC media player");
    136. }
    137. localKey =
    138. RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
    139. RegistryView.Registry64);
    140. localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TeamSpeak 3 Client");
    141. if (Environment.Is64BitOperatingSystem == true)
    142. {
    143. if (localKey != null)
    144. {
    145. //MessageBox.Show("Found");
    146. if (localKey.GetValue("DisplayName") != null)
    147. {
    148. dp.Add(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TeamSpeak 3 Client");
    149. }
    150. }
    151. else
    152. {
    153. dp.Add(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\TeamSpeak 3 Client");
    154. }
    155. }
    156. else
    157. {
    158. dp.Add(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\TeamSpeak 3 Client");
    159. }
    160. localKey =
    161. RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
    162. RegistryView.Registry64);
    163. localKey = localKey.OpenSubKey(@"SOFTWARE\Wow6432Node\Reditec\iUP");
    164. if (Environment.Is64BitOperatingSystem == true)
    165. {
    166. if (localKey != null)
    167. {
    168. //MessageBox.Show("Found");
    169. if (localKey.GetValue("DisplayName") != null)
    170. {
    171. dp.Add(@"SOFTWARE\Wow6432Node\Reditec\iUP");
    172. }
    173. }
    174. else
    175. {
    176. dp.Add(@"SOFTWARE\Reditec\iUP");
    177. }
    178. }
    179. else
    180. {
    181. dp.Add(@"SOFTWARE\Reditec\iUP");
    182. }
    183. dp.Add(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner");
    184. List<string> dv = new List<string>();
    185. List<string> fnstr = new List<string>();
    186. List<string> updnec = new List<string>();
    187. List<string> dns = new List<string>();
    188. List<string> ver = new List<string>();
    189. List<string> link = new List<string>();
    190. foreach (string dnss in dp)
    191. {
    192. //MessageBox.Show(dnss);
    193. dv.Clear();
    194. string dn = string.Empty;
    195. localKey =
    196. RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
    197. RegistryView.Registry64);
    198. localKey = localKey.OpenSubKey(@dnss);
    199. if (localKey != null)
    200. {
    201. //MessageBox.Show("Found");
    202. if (localKey.GetValue("DisplayName") != null)
    203. {
    204. (new System.Threading.Thread(() =>
    205. {
    206. progressBar1.Style = ProgressBarStyle.Marquee;
    207. })).Start();
    208. dn = localKey.GetValue("DisplayName").ToString();
    209. dn = Regex.Replace(dn, @"[0-9\-]", string.Empty);
    210. dn = Regex.Replace(dn, @"[.\-]", string.Empty);
    211. dn = dn.Replace("VLC media player ", "VLC media player");
    212. //MessageBox.Show(dn +"!");
    213. dns.Add(localKey.GetValue("DisplayName").ToString());
    214. dv.Add(localKey.GetValue("DisplayVersion").ToString());
    215. read(dn, dp, dns, ver, link, updnec, dv, bitos, dnss, updnecls);
    216. }
    217. }
    218. //MessageBox.Show(String.Format(dn));
    219. }
    220. String ct = updnec.Count().ToString();
    221. //MessageBox.Show("Und jetzt der wichtige Scheiß:");
    222. foreach (string dvs in dv)
    223. {
    224. //MessageBox.Show(dvs);
    225. }
    226. int maxmm = new int();
    227. maxmm = link.Count();
    228. WebClient client = new WebClient();
    229. label10.Text = ct;
    230. label11.Text = System.DateTime.Now.ToString();
    231. progressBar1.Style = ProgressBarStyle.Blocks;
    232. System.IO.Directory.CreateDirectory("tmp");
    233. button3.Enabled = false;
    234. progressBar1.Style = ProgressBarStyle.Blocks;
    235. (new System.Threading.Thread(() =>
    236. {
    237. int mmn = 0;
    238. int mmx = link.Count();
    239. label6.Text = "0/" + mmx;
    240. (new System.Threading.Thread(() =>
    241. {
    242. progressBar1.Maximum = 1;
    243. progressBar1.Value = 0;
    244. })).Start();
    245. int vochar = link.Count();
    246. //MessageBox.Show(vochar.ToString());
    247. foreach (string lz in link)
    248. {
    249. label5.Text = updnec[mmn];
    250. Uri u = new Uri(lz);
    251. string filename = string.Empty;
    252. filename = Path.GetFileName(u.AbsolutePath);
    253. fnstr.Add(filename);
    254. client.DownloadFile(u, "tmp/" + filename);
    255. mmn = mmn + 1;
    256. label6.Text = mmn + "/" + mmx;
    257. (new System.Threading.Thread(() =>
    258. {
    259. progressBar1.Maximum = maxmm;
    260. progressBar1.Increment(1);
    261. })).Start();
    262. }
    263. updnec.Clear();
    264. (new System.Threading.Thread(() =>
    265. {
    266. progressBar1.Value = 0;
    267. })).Start();
    268. mmn = 0;
    269. label7.Text = mmn + "/" + maxmm;
    270. foreach (string gj in fnstr)
    271. {
    272. Process p = new Process();
    273. p.StartInfo.FileName = gj;
    274. p.StartInfo.WorkingDirectory = "tmp";
    275. p.StartInfo.UseShellExecute = true;
    276. if (gj.Contains("iUP-Updater"))
    277. {
    278. p.StartInfo.Arguments = "/qn";
    279. }
    280. else
    281. {
    282. p.StartInfo.Arguments = "/S";
    283. }
    284. p.Start();
    285. p.WaitForExit();
    286. (new System.Threading.Thread(() =>
    287. {
    288. progressBar1.Maximum = maxmm;
    289. progressBar1.Increment(1);
    290. label7.Text = mmn + "/" + maxmm;
    291. })).Start();
    292. mmn = mmn + 1;
    293. //button3.Enabled = true;
    294. (new System.Threading.Thread(() =>
    295. {
    296. progressBar1.Value = 0;
    297. progressBar1.Style = ProgressBarStyle.Blocks;
    298. })).Start();
    299. }
    300. if (updnec.Count() == 0)
    301. {
    302. button3.Enabled = true;
    303. progressBar1.Value = 0;
    304. (new System.Threading.Thread(() =>
    305. {
    306. progressBar1.Style = ProgressBarStyle.Blocks;
    307. })).Start();
    308. }
    309. })).Start();
    310. }
    311. void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    312. {
    313. }
    314. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    315. {
    316. }
    317. private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    318. {
    319. //progressBar1.Maximum = TotalBytesToReceive;
    320. ////progressBar1.Value = BytesReceived;
    321. //string sysload = progressBar1.Value / 1000000 + "/" + progressBar1.Maximum / 1000000 + " MB geladen";
    322. //label12.Text = sysload;
    323. }
    324. private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    325. {
    326. }
    327. private void label13_Click(object sender, EventArgs e)
    328. {
    329. }
    330. private void button2_Click(object sender, EventArgs e)
    331. {
    332. Form2 newForm2 = new Form2();
    333. newForm2.ShowDialog();
    334. }
    335. }
    336. }


    Das ist meine Source. Kann mir bitte jemand sagen, warum das Programm während es nach Updates sucht einfriert (nur die UI) und nicht die Marquee - Bar anzeigt? :) (Ist doch schon ein neuer Thread)

    Danke im Voraus für eure Hilfe!
    So, erster Run deines codes, nichts freezed bei mir. irgendwelche Werte irgendwelcher Labels werden gesetzt.

    Nun mal zum Quellcode:

    C#-Quellcode

    1. CheckForIllegalCrossThreadCalls
    2. = false;
    BÖSE, sofort rauswerfen und richtig machen!
    msdn.microsoft.com/de-de/libra…hodinvoker(v=vs.110).aspx

    C#-Quellcode

    1. (new
    2. System.Threading.Thread(() =>{progressBar1.Style =
    3. ProgressBarStyle.Marquee;})).Start();
    Wozu in einem Thread die
    Progressbar des Hauptthreads (von welchem du aus den Thread startest)
    ändern? zudem möchtest du im Normalfall, wenn du schon nen kompletten
    Thread startest auch kontrolle über diesen haben. demnach also:

    C#-Quellcode

    1. Thread t1 = new Thread(Methodenname/delegat/lambda);
    2. t1.Start();


    weiter im Text:

    C#-Quellcode

    1. private void read(string dn, List<string> dp,
    2. List<string> dns, List<string> ver, List<string> link,
    3. List<string> updnec, List<string> dv, string bitos, string
    4. dnsss, string updnecls)
    5. List<string> link = new List<string>();
    6. read(dn, dp, dns, ver, link, updnec, dv, bitos, dnss, updnecls);
    7. int maxmm = new int();
    8. maxmm = link.Count();
    sofern du nicht mit out oder ref arbeitest, kann link nie etwas enthalten

    C#-Quellcode

    1. (new System.Threading.Thread(() =>
    2. {
    3. foreach (string lz in link)
    4. {
    5. (new System.Threading.Thread(() =>
    6. {
    7. progressBar1.Maximum = 1;
    8. progressBar1.Value = 0;
    9. })).Start();
    10. }
    11. })).Start();
    befinden wir uns im Film Inception?

    Es tut mir leid das so sagen zu müssen, aber dein Code ist ranz.
    Starten eines Threads vom Hauptthread um dann als einzige aufgabe auf ein Control im Hauptthread zuzugreifen?
    Was du brauchst ist nicht Threading, sondern einen konkreten Plan, was wann passieren soll. Wenn du etwas hast, dass wirklich so viel Zeit benötigt, dass es den Hauptthread einfrieren lassen würde, dann hau alles zusammen, in EINEN Thread. Mit etwas pech baust du dir hier etliche Race-Conditions auf, weil deine Threads gleichzeitig auf ein control zugreifen wollen.

    reditec schrieb:

    (Ist doch schon ein neuer Thread)
    Sehe ich nicht. Die "read()" führt beispielsweise ein UploadValues durch, was lange dauern kann und liegt direkt im button3_Click.

    PS: "CheckForIllegalCrossThreadCalls = false;" :huh: Das ist aber nicht sehr schön.

    //Edit: Oh EaranMaleasi war schneller, aber zum Glück hast du den Teil der lange Predigt übernommen :)

    Bluespide schrieb:

    reditec schrieb:

    (Ist doch schon ein neuer Thread)
    Sehe ich nicht. Die "read()" führt beispielsweise ein UploadValues durch, was lange dauern kann und liegt direkt im button3_Click.

    PS: "CheckForIllegalCrossThreadCalls = false;" :huh: Das ist aber nicht sehr schön.

    //Edit: Oh EaranMaleasi war schneller, aber zum Glück hast du den Teil der lange Predigt übernommen :)


    CheckForIllegal... Das schalte ich später ab, wenn das Programm so läuft wie es soll. Beeinflusst aktuell nur die Schönheit des Codes :D
    Werde mla versuchen UploadValues in nem neuen Thread auszuführen :)
    Hi
    nope. Dem ist nicht so. Durch CheckForIllegalCrossThreadCalls = False programmiert sich Software anders, als mit True, damit programmierst du am besten jetzt gleich ein, sonst hast du demnächst ein Programm, das du quasi von vorne Programmieren darfst, weil du den ganzen Code sowieso nochmal durchgehen musst, um auch ja alle Fehler zu eliminieren. Wäre zumindest ab einem kleineren Projekt schon so.

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    Hi
    nope. Dem ist nicht so. Durch CheckForIllegalCrossThreadCalls = False programmiert sich Software anders, als mit True, damit programmierst du am besten jetzt gleich ein, sonst hast du demnächst ein Programm, das du quasi von vorne Programmieren darfst, weil du den ganzen Code sowieso nochmal durchgehen musst, um auch ja alle Fehler zu eliminieren. Wäre zumindest ab einem kleineren Projekt schon so.

    Gruß
    ~blaze~

    Ich werde das Programm auch noch neu schreiben :)
    Aber ich will als erstes, das diese Download - Bar freezed.
    Wenn ich den Knopf drücke soll eigentlich während er nach Updates sucht die ganze Zeit Marquee durchlaufen. Das passiert aber nicht. Ich kann das Fenster nichtmal bewegen. (=freeze)
    Sobald er Updates herunterlädt oder installiert, geht wieder alles :)

    Was mache ich falsch? (Bitte mit etwas Code als Antwort, wie es richtig geht. Ich habe euch schließlich auch ordentlich Code geschickt.)

    Bluespide schrieb:

    Sehe ich nicht. Die "read()" führt beispielsweise ein UploadValues durch, was lange dauern kann und liegt direkt im button3_Click.
    deswegen Freezt es.
    Lösung: richtiges Threading. Ansatz: Was willst du wann tun. erstelle dir einen Plan davon, was deine Anwendung wann macht, und überlege was lange dauert. DANN baust du dir einen Thread.