Действительно ли уместно расширить Управление для обеспечения последовательно безопасной функциональности Invoke/BeginInvoke?

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

Также вы можете щелкнуть правой кнопкой мыши по изображению и выбрать «Копировать местоположение изображения», и это даст вам новую ссылку. Я лично предпочитаю другой метод, так как он дает правильный предварительный просмотр изображения в полном размере.

просмотр нового изображения

33
задан Greg D 14 July 2009 в 21:05
поделиться

2 ответа

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

Вот одна ссылка, говорящая об этом. Также существуют другие.

Но основной ответ, который я имею: Да, я думаю, что у Вас есть хорошая идея здесь.

5
ответ дан 27 November 2019 в 19:34
поделиться

Необходимо создать, Начинаются и методы расширения Конца также. И если Вы используете дженерики, можно выполнить вызов выглядеть немного более хорошим.

public static class ControlExtensions
{
  public static void InvokeEx<T>(this T @this, Action<T> action)
    where T : Control
  {
    if (@this.InvokeRequired)
    {
      @this.Invoke(action, new object[] { @this });
    }
    else
    {
      if (!@this.IsHandleCreated)
        return;
      if (@this.IsDisposed)
        throw new ObjectDisposedException("@this is disposed.");

      action(@this);
    }
  }

  public static IAsyncResult BeginInvokeEx<T>(this T @this, Action<T> action)
    where T : Control
  {
    return @this.BeginInvoke((Action)delegate { @this.InvokeEx(action); });
  }

  public static void EndInvokeEx<T>(this T @this, IAsyncResult result)
    where T : Control
  {
    @this.EndInvoke(result);
  }
}

Теперь Ваши вызовы становятся немного короче и более чистыми:

this.lblTimeDisplay.InvokeEx(l => l.Text = this.task.Duration.ToString());

var result = this.BeginInvokeEx(f => f.Text = "Different Title");
// ... wait
this.EndInvokeEx(result);

И относительно Components, просто вызовите на форму или сам контейнер.

this.InvokeEx(f => f.toolStripItem1.Text = "Hello World");
11
ответ дан 27 November 2019 в 19:34
поделиться
Другие вопросы по тегам:

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