Редактировать
Исходя из приведенных ниже предложений по отправке делегатов GUI с логическим кодом, я придумал такой код:
Action ClearFunction = new Action(()=>Invoke(new Action(delegate() { ResultsBox.Clear(); } ) ));
Можно ли сократить это?
Вот часть моей программы для C # windows-форм.
Когда я начал преобразовывать код для использования другого потока, он начал казаться очень грубым, поскольку я порождал потоки и создавал открытые методы, обернутые в делегаты, чтобы логический код мог фактически использовать GUI.
Пожалуйста, дайте предложения о лучших идиомах или улучшениях архитектуры. Спасибо.
// form1.cs
public void ClearResultsBox()
{
ResultsBox.Clear();
}
public void PrintResults(string s)
{
ResultsBox.AppendText(s);
}
private void SearchButton_Click(object sender, EventArgs e)
{
var t = new Thread(() => SearchCore.Execute(DirectoryBox.Text, SearchBox.Text, this));
t.Start();
}
// logic.cs
class SearchCore
{
delegate void ClearFunction();
delegate void AppendFunction(string a);
static ClearFunction clear;
static AppendFunction print;
public static void Execute(string path, string searchterm, MainForm form)
{
clear = new ClearFunction(() => form.Invoke(new ClearFunction(form.ClearResultsBox)));
print = new AppendFunction(s => form.Invoke(new AppendFunction(form.PrintResults), s));
clear();