InvalidOperationException - Ungültiger threadübergreifender Vorgang

  • C#
  • .NET 4.5

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

    InvalidOperationException - Ungültiger threadübergreifender Vorgang

    Hey Leute,

    ich habe etwas mit Firebase rumprobiert. Das ist alles kein Problem mit FireSharp, doch irgendwie Scheiter ich gerade an den einfachsten Dingen. Ich kriege es nicht gebacken eine Variable zu einer Checkbox hinzuzufügen. Sooft habe ich das mit C# noch nicht gemacht (hust einmal bisher). Ich habe auch schon danach zu suchen doch das mit dem Invork funktioniert dann nicht mehr so gut, da es ja nicht mehr den int zurück gibt. Als Info, LBWCB1 ist die Checkbox.
    Spoiler anzeigen

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. static string BasePath = "https://some-really-nice-shit-what-you-can-not-imagine.firebaseio.com/";
    4. static string FirebaseSecret = "some-really-nice-secret";
    5. private static FirebaseClient client;
    6. //var dict = new Dictionary<String, Tuple<string, string, bool, int>>();
    7. public static Dictionary<String, Tuple<int, string>> dict = new Dictionary<String, Tuple<int, string>>();
    8. public Form1()
    9. {
    10. InitializeComponent();
    11. }
    12. public void Form1_Load(object sender, EventArgs e)
    13. {
    14. InitiAll();
    15. }
    16. private void LBWCB1_SelectedIndexChanged(object sender, EventArgs e)
    17. {
    18. }
    19. public void createConfig()
    20. {
    21. IFirebaseConfig config = new FirebaseConfig
    22. {
    23. AuthSecret = FirebaseSecret,
    24. BasePath = BasePath
    25. };
    26. client = new FirebaseClient(config);
    27. }
    28. private async void initEvent()
    29. {
    30. EventStreamResponse response = await client.OnAsync("", (sender, args) =>
    31. {
    32. //Add
    33. if (args.Data.Equals("an"))
    34. {
    35. //var tu = new Tuple<int, String>(new Form1().LBWCB1.Items.Add(args.Path, true), args.Data);
    36. dict.Add(args.Path, Tuple.Create(this.LBWCB1.Items.Add(args.Path, true), args.Data));
    37. }
    38. else if (args.Data.Equals("aus"))
    39. {
    40. //var tu = new Tuple<int, String>(new Form1().LBWCB1.Items.Add(args.Path, false), args.Data);
    41. dict.Add(args.Path, Tuple.Create(this.LBWCB1.Items.Add(args.Path, false), args.Data));
    42. }
    43. }, (sender, args) =>
    44. {
    45. //Change
    46. if (args.Data.Equals("an"))
    47. {
    48. if (dict.ContainsKey(args.Path))
    49. {
    50. Tuple<int, String> tt;
    51. if (dict.TryGetValue(args.Path, out tt))
    52. {
    53. this.LBWCB1.SetItemChecked(tt.Item1, true);
    54. }
    55. }
    56. }
    57. else if (args.Data.Equals("aus"))
    58. {
    59. if (dict.ContainsKey(args.Path))
    60. {
    61. Tuple<int, String> tt;
    62. if (dict.TryGetValue(args.Path, out tt))
    63. {
    64. this.LBWCB1.SetItemChecked(tt.Item1, false);
    65. }
    66. }
    67. }
    68. }, (sender, args) =>
    69. {
    70. //Remove
    71. if (dict.ContainsKey(args.Path))
    72. {
    73. Tuple<int, String> tt;
    74. if (dict.TryGetValue(args.Path, out tt))
    75. {
    76. this.LBWCB1.Items.RemoveAt(tt.Item1);
    77. }
    78. }
    79. });
    80. }
    81. public void InitiAll()
    82. {
    83. createConfig();
    84. initEvent();
    85. }
    86. }




    Oder vielleicht habe ich es auch nur einfach mit dem Invork falsch verstanden. Ich glaube das wird es auch sein, aber am besten wäre es, wenn es sich noch einfacher lösen könnte. Die Hilfe von MS war nicht so.... naja.... hilfreich ;) .

    MFG Nils
    Wenn ich LBWCB1.Items.Add(args.Path, true) ausführe, gibt mir dies die Position des hinzugefügten Objektes zurück, und fügt es hinzu. Diesen int meine ich.
    Generell ists keine gute Idee Massenoperationen an Controls über einen Thread laufen zu lassen. Invoking ist ein erheblicher Performance-Fresser.
    Kannst du nicht deine Daten komplett in einer Liste anlegen?
    Dann kannst du, wenn die Daten beisammen sind, das in einem Rutsch ins Listview schubsen, das wäre vielfach effizienter.

    nurso ins blaue hinein, was du da im einzelnen treibst, versteh ich nämlich nicht wirklich.