Анонимный метод как параметр к BeginInvoke?

На самом деле то, что вы хотите использовать , это SecureZeroMemory() .

Оптимизирующий компилятор может удалять вызовы memset(), и SecureZeroMemory() предназначен для предотвращения этого.

Раньше я думал, что звонки ZeroMemory() не нужны, пока не наткнулся на этот факт.

19
задан Michał Powaga 28 November 2011 в 09:17
поделиться

5 ответов

Попробуйте следующее:

control.BeginInvoke((MethodInvoker) delegate { /* method details */ });

Или:

private void ConfigureMainMenu(DIServer server)
{
    if (control.InvokeRequired)
    {
        control.BeginInvoke(new Action<DIServer >(ConfigureMainMenu), server);
    }
    else
    {
        /* do work */
    }
}

Или:

private void ConfigureMainMenu(DIServer server)
{
    MenuStrip mnMnu = PresenterView.MainMenu;
    if (mnMnu.InvokeRequired)
    {
        // Private variable
        _methodInvoker = new MethodInvoker((Action)(() => ConfigureMainMenu(server)));
        _methodInvoker.BeginInvoke(new AsyncCallback(ProcessEnded), null); // Call _methodInvoker.EndInvoke in ProcessEnded
    }
    else
    {
        /* do work */
    }
}
36
ответ дан 30 November 2019 в 03:20
поделиться

Вы должны иметь возможность написать что-то вроде этого:

private void ConfigureMainMenu(DIServer server,)
{
    MenuStrip mnMnu = PresenterView.MainMenu;
    if (mnMnu.InvokeRequired)
    {
        mnMnu.BeginInvoke(new Action<DIServer>(ConfigureMainMenu), 
                            new object[] { server});
    }
    else
    {
        // Do actual work here
    }
}
2
ответ дан 30 November 2019 в 03:20
поделиться

Я пробовал кучу разных методов, но ни один из них не помог. т.е. ...


// Fails -- cannot convert lamda to System.Delegate
mnMnu.BeginInvoke( (DIServer svr)=> {ConfigureMainMenu(server);}, new object[] server);
// Fails -- cannot convert anonymous method to System.Delegate
mnMnu.BeginInvoke( new delegate(DIServer svr){ConfigureMainMenu(server);}, new object[] server);

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

РЕДАКТИРОВАТЬ: Оказывается, я ошибаюсь. Приведенный ниже ответ methodinvoker работает. См. Эту страницу

0
ответ дан 30 November 2019 в 03:20
поделиться

Вы можете написать метод расширения, который будет обертывать анонимные методы и даже позаботится о семантике InvokeRequired :

public static void InvokeAction(this Control ctl, Action a)
{
    if (!ctl.InvokeRequired)
    {
        a();
    }
    else
    {
        ctl.BeginInvoke(new MethodInvoker(a));
    }
}

Это позволит вам:

control.InvokeAction(delegate() { ConfigureMainMenu(server); });
1
ответ дан 30 November 2019 в 03:20
поделиться

Для полностью анонимных методов с ограниченное количество параметров:

Func<int, int?> caller = new Func<int, int?>((int param1) =>
   {
      return null;
   });

caller.BeginInvoke(7, new AsyncCallback((IAsyncResult ar) =>
{
   AsyncResult result = (AsyncResult)ar;
   Func<int, int?> action = (Func<int, int?>)result.AsyncDelegate;
   action.EndInvoke(ar);
}), null);

При необходимости можно использовать один из других типов делегатов Func.

0
ответ дан 30 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: