2014-09-25 8 views
-1

Это относится к моему предыдущему сообщению here, где я спросил, почему я должен использовать SynchronizationContext .Send или .Post, только через обычный .Invoke или .BeginInvoke в моей основной форме пользовательского интерфейса.Передача нескольких параметров SendOrPostCallback в SynchronizationContext

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

Проблема в том, что .Send и .Post принимает только делегат SendOrPostCallbake в качестве своего ввода, и этот делегат может быть связан только с методами, в которых для каждого объекта есть один объект. Поскольку все может быть упаковано в объект, мне было рекомендовано либо создать класс для упаковки моих переменных (этот параметр я понимаю, как реализовать), а другой - использовать лямбда-выражения с закрытием. Это последнее, что я не понимаю, как это сделать.

Любое руководство по использованию лямбда-выражений в _synch.Send(), когда мой базовый метод имеет два строковых параметра, будет очень благодарен.

EDIT. Основываясь на рекомендациях в комментариях, я смог ответить на свой вопрос. Я разместил решение ниже для будущих посетителей.

+0

Так что, когда вы сделали ваши основные исследования по этой теме, что вы не понимаете, что вы нашли? Существует * тонна информации о наличии на закрытии, которая легко доступна. – Servy

+0

@Servy Давайте возьмем этот ресурс, например: http://stackoverflow.com/questions/595482/what-are-closures-in-c. Я не понимаю, как лямбда-выражения избавят меня от необходимости создавать целый новый класс для хранения моих двух строк (например, класса Person в примере). – Anders

+0

Почему * * * вам нужно создать совершенно новый тип для хранения этих двух экземпляров, когда вы могли бы просто закрыть каждый из них, как показано прямо здесь, в этом примере? Обратите внимание, что 'p' не закрывается в этом примере; это параметр. 'id' - закрытая переменная. – Servy

ответ

0

Основываясь на рекомендациях, представленных в комментариях, я написал следующее решение.

В главном классе UI:

public SynchronizationContext UISynchContext { get; private set; } 
public static MainForm Get { get; private set; } 

public MainForm() 
{ 
    InitializeComponent(); 
    Get = this; 
    UISynchContext = SynchronizationContext.Current; 
} 

public void UpdateText(string labelName, string text) 
{ 
    var label = (Label)Controls.Find(labelName, true).FirstOrDefault(); 
    if (label != null) label.Text = text; 
} 

В классе рабочих:

private readonly SynchronizationContext _uiSynch; 

public Worker(UpdateValueCallback updateValueCallback, Player player) 
{ 
    _uiSynch = MainForm.Get.UISynchContext; 
} 

_uiSynch.Send(o => 
{ 
    string labelName = "lbOne"; 
    string labelText = methodThatReturnsNewText(); 

    MainForm.Get.UpdateText(labelName, labelText); 
}, null); 
Смежные вопросы