C# 如何安全地删除委托?
有人要求一个非常明确的职位。我正在尝试从主线程上的更新函数更新我的UI。我试图通过使用委派来完成,但没有成功。我的订阅服务器有时从辅助线程调用,有时从主线程调用,我如何解决这个问题?我的更新功能中的内容会导致很多问题C# 如何安全地删除委托?,c#,multithreading,thread-safety,task,C#,Multithreading,Thread Safety,Task,有人要求一个非常明确的职位。我正在尝试从主线程上的更新函数更新我的UI。我试图通过使用委派来完成,但没有成功。我的订阅服务器有时从辅助线程调用,有时从主线程调用,我如何解决这个问题?我的更新功能中的内容会导致很多问题 private void Update() { if (update != null) { lock (update) { update.Invoke(oldState, state);
private void Update()
{
if (update != null)
{
lock (update)
{
update.Invoke(oldState, state);
update = null;
}
}
}
private void LoginSubscirber(AppState oldState, AppState state)
{
lock (state)
{
if (oldState.loginState != state.loginState)
{
if (state.loginState == loginStateEnum.loadingLogin)
{
update = LoadingLoginCallback;
}
else if (state.loginState == loginStateEnum.successLogin)
{
update = LoginSuccescCallback;
}
}
}
}
loginsubstrirber
(忽略我的拼写错误)有时会通过Task.Factory.StartNew()调用我在线程安全上搜索了更多信息后,最终使用了此方法。我希望它在所有情况下都能正常工作:
ConcurrentQueue<MethodToExecute> threadSafeQueue = new ConcurrentQueue<MethodToExecute>();
private void Update()
{
if (threadSafeQueue.Count > 0)
{
MethodToExecute changeUI;
threadSafeQueue.TryDequeue(out changeUI);
changeUI.action(changeUI.oldState, changeUI.state);
}
}
private void Start()
{
StoreCreator.GetInstance.store.Subscribe += LoginSubscirber;
}
private void LoginSubscirber(AppState oldState, AppState state)
{
lock (state)
{
if (oldState.loginState != state.loginState)
{
if (state.loginState == loginStateEnum.loadingLogin)
{
threadSafeQueue.Enqueue(new MethodToExecute(LoadingLoginCallback, oldState, state));
}
else if (state.loginState == loginStateEnum.successLogin)
{
threadSafeQueue.Enqueue(new MethodToExecute(LoginSuccescCallback, oldState, state));
}
else if (state.loginState == loginStateEnum.failLogin)
{
threadSafeQueue.Enqueue(new MethodToExecute(LoginFailCallback, oldState, state));
}
/*lock (oldState)
{
this.oldState = oldState;
this.state = state;
}*/
}
}
}
ConcurrentQueue threadSafeQueue=新建ConcurrentQueue();
私有void更新()
{
如果(threadSafeQueue.Count>0)
{
方法实施变革;
threadSafeQueue.TryDequeue(out changeUI);
changeUI.action(changeUI.oldState,changeUI.state);
}
}
私有void Start()
{
StoreCreator.GetInstance.store.Subscribe+=LoginSubscirber;
}
私有void loginsubsirber(AppState-oldState,AppState-state)
{
锁(状态)
{
if(oldState.loginState!=state.loginState)
{
if(state.loginState==loginStateEnum.loadingLogin)
{
Enqueue(执行的新方法(加载LoginCallback、oldState、state));
}
else if(state.loginState==loginStateEnum.successLogin)
{
Enqueue(新方法执行(LoginSAccessCallback、oldState、state));
}
else if(state.loginState==loginStateEnum.failLogin)
{
Enqueue(新方法执行(LoginFailCallback、oldState、state));
}
/*锁(旧状态)
{
this.oldState=oldState;
this.state=状态;
}*/
}
}
}
您可以使用以下功能:
var mDel = (RoutedEventHandler)delegate { clicked(a2, null); };
bxBox[z].Click += mDel ;
...
bxBox[z].Click -= mDel ;
有成千上万的“如何从{your_favorite_framework}中的其他线程更新UI”。。。像WPF。。。您的问题可能与其中一些问题重复…如果您有任何建议,请帮助我a2和bxBox的含义是什么?int a2=3;bxBox是PictureBox。但它与我的案例有何关联?我不明白。我如何整合它?这并不能解决OP的问题,至少需要更多的上下文来理解这与手头的问题有什么关系。