На самом деле то, что вы хотите использовать , это SecureZeroMemory()
.
Оптимизирующий компилятор может удалять вызовы memset()
, и SecureZeroMemory()
предназначен для предотвращения этого.
Раньше я думал, что звонки ZeroMemory()
не нужны, пока не наткнулся на этот факт.
Попробуйте следующее:
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 */
}
}
Вы должны иметь возможность написать что-то вроде этого:
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
}
}
Я пробовал кучу разных методов, но ни один из них не помог. т.е. ...
// 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 работает. См. Эту страницу
Вы можете написать метод расширения, который будет обертывать анонимные методы и даже позаботится о семантике 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); });
Для полностью анонимных методов с ограниченное количество параметров:
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.