Удалить текст с помощью Invoke?

Итак, документация, которую я до сих пор нашел в Интернете относительно свойства Invoke, не кажется особенно хорошей, что на самом деле раздражает, верите вы или нет. Я понимаю, что делает Invoke - вы не можете безопасно получить доступ к графическому интерфейсу напрямую, поэтому invoke делает это безопасным способом. Это нормально, но я не понимаю переменных, которые входят в метод. Если бы я хотел, например, удалить текст из списка, как бы я это сделал? Я доберусь до этого далеко, прежде чем я немного потерялся.

private void DoStuff(string TextIWouldBeRemoving)
{        

if (listboxname.InvokeRequired)
    {
        listboxname.Invoke(SomeMysteriousParamaters, new object[] { TextIWouldBeRemoving )};   
    }
}

3 ответа

Решение

Первый параметр - это метод, который вы хотите безопасно вызывать, второй параметр - массив объектов с аргументами этого метода.

Так что вы бы написали:

private void DoStuff(string TextIWouldBeRemoving)
{        
    if (listboxname.InvokeRequired)
    {
        listboxname.Invoke(DoStuff, new object[] { TextIWouldBeRemoving )};   
    }
    else
    {
        // Actually remove the text here!
    }
}
  private void button1_Click(object sender, EventArgs e)
  {
     if (listBox1.InvokeRequired)
     {
        Action<string> d = DoAnything;
        listBox1.Invoke(d, new object[] { "Item 1" });
     }
     else
        DoAnything("Item 1");
  }

  void DoAnything(string itemText)
  {
     listBox1.Items.Remove(itemText);
  }

Invoke - это все о потоках.

Вы должны выполнять вызов всякий раз, когда вы создали отдельный поток в своем коде, и вам нужно обновить элементы пользовательского интерфейса, не добавляя код, который выполняется в этом новом созданном потоке.

Вы можете использовать BeginInvoke вместо синхронного метода Invoke. Эта статья имеет хороший пример:

http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx

Другие вопросы по тегам