Можете ли вы использовать предопределенное действие <T>в Control.BeginInvoke - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть некоторые проверки многопоточности, и я могу заставить работать нижеприведенное, позвонив BeginInvoke(new Action<string,string>........, но мне было интересно, можно ли каким-либо образом использовать предопределенные Действия?

private Action<string, string> DoSomething();

private void MakeItHappen(string InputA, string InputB)
{
  if (this.InvokeRequired)
  {
    this.BeginInvoke(DoSomething(InputA, InputB));
  }
  else
  {
     Label.Text = "Done";
     MyOtherGUIItem.Visible = false;
  }

}

Ответы [ 4 ]

1 голос
/ 13 февраля 2012

Если я правильно понял, вы хотите что-то подобное?

private delegate void updateDelegate(string p1, string p2);
private updateDelegate DoSomething;

private void MakeItHappen(string InputA, string InputB)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(DoSomething, InputA, InputB);
    }
    else
    {
        //Do stuff
    }
}
1 голос
/ 13 февраля 2012

Это то, что вы имеете в виду?

private Action<string, string> _DoSomething;

public void ConfigureToSecondThanFirstByExistingFunction()
{
    _DoSomething = MyMakeItLowerImplementation;
}

public void ConfigureToFirstThenSecondByLambda()
{
    _DoSomething = (a, b) => Console.WriteLine(a + b);
}

public void CallMe()
{
    ConfigureToSecondThanFirstByExistingFunction();
    //ConfigureToFirstThenSecondByLambda();

    _DoSomething("first", "second");
}

private void MyMakeItLowerImplementation(string a, string b)
{
    Console.WriteLine(b + a);
}
0 голосов
/ 13 февраля 2012

Таким образом?:

private delegate void DoSomethingHandler(string A, string B);
private event DoSomethingHandler DoSomething;

public void Start()
{
   DoSomething = (a, b) => { /*doStuff*/ };
}

private void MakeItHappen(string InputA, string InputB)
{
  if (this.InvokeRequired)
  {
    this.BeginInvoke(DoSomething, InputA, InputB);
  }
  else
  {
    //Do stuff
  }    
}
0 голосов
/ 13 февраля 2012

Вы должны передать delegate равному BeginInvoke. Вы можете использовать захват переменных, чтобы обернуть ваши параметры следующим образом:

private void MakeItHappen(string InputA, string InputB)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke((Action)delegate () { 
            MakeItHappen(InputA, InputB); 
        });
    }
    else
    {
        // do stuff with InputA and InputB
    }
}
...