Variable bleibt leer obwohl ich sie versuche aus einem Task zu befüllen

  • WPF

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Variable bleibt leer obwohl ich sie versuche aus einem Task zu befüllen

    Ich stehe gerade auf dem Schlauch...

    Ich versuche aus einem Task heraus eine Variable (string) die sich ausserhalb des Tasks befindet mit Informationen zu befüllen.
    Nur habe ich jetzt das Problem das diese Variable erst garnicht befüllt wird.

    Mein Code:
    Spoiler anzeigen

    C#-Quellcode

    1. string deployEffect = "";
    2. string error = "";
    3. Task task = Task.Run(() => {
    4. Dispatcher.BeginInvoke(new Action(() => {
    5. List<int> allValues = new List<int>();
    6. for (int i = 0; i < effects.Count; i++) {
    7. int value = int.Parse(effects[i].ValuePercentLabel.Text.Replace('%', '\0'));
    8. Console.WriteLine(value.ToString()); // DEBUG
    9. if (value != 0) {
    10. allValues.Add(value);
    11. }
    12. }
    13. Console.WriteLine("Count: {0}", allValues.Count.ToString()); // DEBUG
    14. if (allValues.Count != 0) {
    15. double maxValue = allValues.Max();
    16. for (int e = 0; e < effects.Count; e++) {
    17. int labelValue = int.Parse(effects[e].ValuePercentLabel.Text.Replace('%', '\0'));
    18. if (labelValue == maxValue) {
    19. deployEffect = effects[e].EffectName; // Fill 'deployEffect' variable
    20. break;
    21. }
    22. }
    23. }
    24. else {
    25. error = "There were no votes on any given effects."; // Fill 'error' variable
    26. }
    27. EffectContainer.Children.Clear();
    28. effects.Clear();
    29. usersVoted.Clear();
    30. totalVotes = 0;
    31. TotalVotesLabel.Text = "Total votes: 0";
    32. }));
    33. });
    34. Task.WaitAll(task);
    35. if (error == "") {
    36. if (deployEffect != "") {
    37. pipe.Write(string.Format("deploy:effect:{0}", deployEffect));
    38. }
    39. else {
    40. pipe.Write("error:whileDeployingEffect:deployEffect was empty. This should never be the case."); // Immer wird diese Zeile wird ausgeführt was nicht stimmt.
    41. }
    42. }
    43. else {
    44. pipe.Write(string.Format("error:noVotesOnAnyEffect:{0}", error)); // Eigentlich sollte diese hier ausgeführt werden was bedeutet das 'error' leer ist.
    45. }



    Weiß jemand wie man dieses Problem lösen könnte?

    // LÖSUNG //
    Dispatcher.BeginInvoke durch Dispatcher.Invoke ersetzen.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ClonkAndre“ ()

    @ClonkAndre Poste so viel Code, dass wir ihn compilieren können, wenn wir ihn per C&P einfügen.
    Vergewissere Dich, dass es an dem ist.
    Scheib, welche Controls da sein müssen.
    Dispatcher
    effects
    EffectContainer
    ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Der EffectContainer ist ein einfaches StackPanel.
    Der Dispatcher ist vom aktuellen Fenster (this.Dispatcher).

    effects ist eine list of EffectItem welches ein UserControl ist.
    Das UserControl beinhaltet folgende Elemente:
    1. ValueProgressBar (ProgressBar)
    2. ItemNumberLabel (TextBlock)
    3. EffectNameLabel (TextBlock)
    4. ValuePercentLabel (TextBlock)

    Der Code des UserControls:
    Spoiler anzeigen

    C#-Quellcode

    1. #region Properties
    2. public string EffectName
    3. {
    4. get { return EffectNameLabel.Text; }
    5. set { EffectNameLabel.Text = value; }
    6. }
    7. public int ItemNumber
    8. {
    9. get { return int.Parse(ItemNumberLabel.Text.Substring(0, 1)); }
    10. set { ItemNumberLabel.Text = value + "."; }
    11. }
    12. public double VotingValue
    13. {
    14. get { return ValueProgressBar.Value; }
    15. set { ValueProgressBar.Value = value; }
    16. }
    17. public string PercentNumber
    18. {
    19. get { return ValuePercentLabel.Text; }
    20. set { ValuePercentLabel.Text = value; }
    21. }
    22. #endregion
    23. public EffectItem(string _effectName) // Constructor
    24. {
    25. InitializeComponent();
    26. EffectNameLabel.Text = _effectName;
    27. }



    Neue EffectItem(s) füge ich dem StackPanel (EffectContainer) wie folgt hinzu:
    Spoiler anzeigen

    C#-Quellcode

    1. Task task = Task.Run(() => {
    2. Dispatcher.BeginInvoke(new Action(() => {
    3. EffectItem item = new EffectItem("name");
    4. if (effects.Count == 0) {
    5. item.ItemNumber = 1;
    6. }
    7. else {
    8. item.ItemNumber = effects.Count + 1;
    9. }
    10. effects.Add(item);
    11. EffectContainer.Children.Add(item);
    12. }));
    13. });
    14. Task.WaitAll(task);
    15. pipe.Write("success:addingEffect");



    @shad
    Danke, ich werde mich mal erkundigen :)
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    ClonkAndre schrieb:

    this.Dispatcher
    braucht WindowsBase.dll.
    Ist das WPF?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Um einen Fehler in einem anderen Thread zu finden, baue ich das „Thread Gerüst“ außenrum ab. Dann kann man das vernünftig debuggen. Wenns dann läuft packe ich das Gemächt wieder zurück in das Thread Konstrukt.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @RodFromGermany
    Jo, sorry hätte ich dazu schreiben sollen.

    @mrMo
    Danke, werde ich mir für zukünftige Thread Probleme merken.

    @shad
    Ich weiss nicht was mich dazu getrieben hat BeginInvoke zu benutzen...
    Stattdessen habe ich es jetzt mit einem einfachen Invoke getestet, und joa, es funktioniert so wie ich es wollte.
    Danke! :)

    Fall soweit gelöst.
    Danke euch allen!
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!