C# 如何安全地删除委托?

C# 如何安全地删除委托?,c#,multithreading,thread-safety,task,C#,Multithreading,Thread Safety,Task,有人要求一个非常明确的职位。我正在尝试从主线程上的更新函数更新我的UI。我试图通过使用委派来完成,但没有成功。我的订阅服务器有时从辅助线程调用,有时从主线程调用,我如何解决这个问题?我的更新功能中的内容会导致很多问题 private void Update() { if (update != null) { lock (update) { update.Invoke(oldState, state);

有人要求一个非常明确的职位。我正在尝试从主线程上的更新函数更新我的UI。我试图通过使用委派来完成,但没有成功。我的订阅服务器有时从辅助线程调用,有时从主线程调用,我如何解决这个问题?我的更新功能中的内容会导致很多问题

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的问题,至少需要更多的上下文来理解这与手头的问题有什么关系。