Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#winforms:我对GUI和逻辑的分离是否正确?_C#_.net_Winforms_User Interface - Fatal编程技术网

C#winforms:我对GUI和逻辑的分离是否正确?

C#winforms:我对GUI和逻辑的分离是否正确?,c#,.net,winforms,user-interface,C#,.net,Winforms,User Interface,编辑 基于以下发送逻辑代码GUI代表的建议,我提出了如下代码: Action ClearFunction = new Action(()=>Invoke(new Action(delegate() { ResultsBox.Clear(); } ) )); 有可能缩短这个吗 这是我的C#windows窗体程序的一部分 当我开始将代码转换为使用另一个线程时,它开始感觉非常粗糙,因为我生成了线程并创建了封装在委托中的公共方法,以便逻辑代码可以实际使用GUI 请给出更好的习惯用法或架构改进的

编辑

基于以下发送逻辑代码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();  

我不会在表单和searchCore之间使用循环引用。
为什么不让搜索逻辑通过回调与表单对话?这样,搜索就不需要了解表单,而且更容易测试。

如何让搜索逻辑通过回调进行回话?这不是我对form.Invoke所做的吗?我同意Ali的观点。我会尝试分离应用程序中的功能,这样SearchCore类就不会处理UI,或者至少不会处理form1上的UI元素。不要将表单参数传递给Execute方法,而是传递一个可以在搜索完成后调用的委托,并允许Form1类执行所需的任何UI操作。将这两个函数的委托作为参数传递给SearchCore,并在GUI中使用+=注册。然后您可以从搜索中调用委托。@阿里,我应该将委托声明放在哪里?另外,您使用+=register是什么意思。listbox的清理是一个gui问题,搜索核心不应该被关注。搜索核心应获取类型为Action:publicstaticvoidexecute(stringpath、stringsearchterm、actionaddresult)的参数,并应调用它:addResult(result);在表单中,有一个方法AppendText(stringsearchresult)并将其作为参数传递给搜索。忽略+=,你不需要它。@senfo其实没有更多。Execute是一个长时间运行的方法(2+分钟),每隔几秒钟就有一次输出。您能提供一些关于您想要完成什么的详细信息吗?你有一些相当大的设计缺陷,但我不想把你引向错误的方向,直到我明白你想去哪里。例如,您只是想让UI保持响应性吗?很抱歉,我删除了我的评论以添加到其中。