Общий метод обновления ошибки межпроводного вызова - PullRequest
0 голосов
/ 01 мая 2019

У меня есть форма, где вам нужно сделать несколько обновлений, используя метод поточно-ориентированных вызовов элементов управления Windows Forms

Выдержки из кода, которые делают это, повторяются несколько раз. Пытаясь провести рефакторинг, я создал некий общий метод обновления.

У меня есть класс для регистрации методов, которые будут использоваться в общем metdo:

public class ListOfUpdateMethods
{
    public delegate void Metodo();
    private List<Metodo> MetodosPreAtualizacao;
    private List<Metodo> MetodosAtualizacao;

    public ListOfUpdateMethods()
    {
        this.MetodosPreAtualizacao = new List<Metodo>();
        this.MetodosAtualizacao = new List<Metodo>();
    }

    public void AddMetodosPreAtualizacao(Metodo m)
    {
        this.MetodosPreAtualizacao.Add(m);
    }

    public void AddMetodosAtualizacao(Metodo m)
    {
        this.MetodosPreAtualizacao.Add(m);
    }

    public void ExecutaMetodosPreAtualizacao()
    {
        foreach (var m in this.MetodosPreAtualizacao)
            m();
    }

    public void ExecutaMetodosAtualizacao()
    {
        foreach (var m in this.MetodosAtualizacao)
            m();
    }
}

Метод:

//General method for updating all Controls as needed 

    private void UpdadeControl(ListOfUpdateMethods list, Control control)
    {
        //Execute required methods before updating the control
        list.ExecutaMetodosPreAtualizacao();

        if (control.InvokeRequired)
        {
            var up = new Updates(UpdadeControl);
            Invoke(up, new object[] { list, control });
        }
        else
        {
            //Execute methods needed to update control
            list.ExecutaMetodosAtualizacao();

        }
    }

Когда я хочу обновить какой-то элемент управления, я делаю следующее:

ListOfUpdateMethods VariavelDeInstancia = new ListOfUpdateMethods();
UpdateStopXRayTimer.AddMetodosAtualizacao(MetodoComInstrucoesQUeAtualizaOControle);
UpdadeControl(VariavelDeInstancia, ControleASerAtualizado);

Однако, когда вызывается MetodoComInstrucoesQUeAtualizaOControle, возникает исключение доступа для скрещенных theadins. То есть метод не работает на основной ступени.

Примером того, что вы будете иметь в этом методе, будет:

void MetodoComInstrucoesQUeAtualizaOControle()
{
   ControleASerAtualizado = "Text";
}

У кого-нибудь есть советы по решению описанной проблемы?

1 Ответ

0 голосов
/ 02 мая 2019

Потому что в вашем коде есть ошибки. Подсказка ниже.

public class ListOfUpdateMethods
{
    public delegate void Metodo();
    private List<Metodo> MetodosPreAtualizacao;
    private List<Metodo> MetodosAtualizacao;

    public ListOfUpdateMethods()
    {
        this.MetodosPreAtualizacao = new List<Metodo>();
        this.MetodosAtualizacao = new List<Metodo>();
    }

    public void AddMetodosPreAtualizacao(Metodo m)
    {
        this.MetodosPreAtualizacao.Add(m);
    }

    public void AddMetodosAtualizacao(Metodo m)
    {
       // change this code.
       // this.MetodosPreAtualizacao.Add(m);
       this.MetodosAtualizacao.Add(m);
    }

    public void ExecutaMetodosPreAtualizacao()
    {
        foreach (var m in this.MetodosPreAtualizacao)
            m();
    }

    public void ExecutaMetodosAtualizacao()
    {
        foreach (var m in this.MetodosAtualizacao)
            m();
    }
}

Я предлагаю вам сменить метод UpdadeControl на следующий.

private void UpdadeControl(ListOfUpdateMethods list, Control control)
{
    // this method can't added the UI operate. 
    // If you added the UI operate delegate. It will throw the exception.
    list.ExecutaMetodosPreAtualizacao();

    if (control.InvokeRequired)
    {
        // you can use Action delegate. Action delegate is so good.
        var action = new Action<ListOfUpdateMethods, Control>(UpdadeControl);
        control.Invoke(action, new object[] { list, control });
    }
    else
    {
        //Execute methods needed to update control
        list.ExecutaMetodosAtualizacao();

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...