创建线程时出现编译时错误

Posted

技术标签:

【中文标题】创建线程时出现编译时错误【英文标题】:Getting compile time error while creating threads 【发布时间】:2021-12-07 00:16:15 【问题描述】:

我是 C# 中的线程新手。我想做的是从 API 获取一些屏幕事件。现在我想在我的主屏幕和辅助屏幕上一起运行这些事件。这是代码sn-p。

private void btn_play_Click(object sender, EventArgs e)

    var path = "C:\\ActiveProjects\\ScreenPlayerClient\\ScreenPlayerClient\\" +
        "ScreenPlayerClient\\bin\\Debug\\netcoreapp3.1\\Json\\eventsfile.json";
    var events = JsonConvert.DeserializeObject<GetEventsResponseModel>(
        File.ReadAllText(path));
    var screens = Screen.AllScreens;
    foreach (var scr in events.Screens)
    
        foreach (var computerscreen in screens)
        
            if (scr.Title == computerscreen.DeviceName)
            
                Thread thr = new Thread(
                    new ThreadStart(playContent(scr, computerscreen)));
            
        
    


private void playContent(ScreenResponseModel scr, Screen screen)

    var fileDetails = apiOperation.DownLoadFile(
        scr.Events.FirstOrDefault().VideoLink).Result;
    var filepath = SaveVideo(fileDetails);
    PlayerForm player = new PlayerForm();
    player.videolink = filepath;
    player.Location = screen.WorkingArea.Location;
    player.StartPosition = FormStartPosition.Manual;
    player.screen = screen;
    player.ShowDialog();

我在

处收到错误“需要方法名称”
Thread thr = new Thread(new ThreadStart(playContent(scr,computerscreen)));

【问题讨论】:

你为什么使用原始线程而不是Task.Run?此外,您不能从任何操作系统的后台线程修改 UI(包括 UI 组件)。看起来唯一真正需要在后台运行的是apiOperation.DownLoadFileSaveVideo(fileDetails);。这些方法有什么作用?您可能可以将它们转换为异步方法,因此您根本不需要额外的线程 是不是和这篇文章差不多? new thread causes "Method Name Expected" error 【参考方案1】:

playContent(scr,computerscreen)

这调用了一个函数。 new Thread 需要一个 ThreadStart 委托,或者可以转换为委托的东西,即 lambda 或方法名称。

试试改成

new Thread(() => playContent(scr,computerscreen));

但是,我会主张使用任务而不是原始线程。几乎没有充分的理由自己创建Thread。即

Task.Run(() => playContent(scr,computerscreen));

但是,playContent 似乎正在做一些与 UI 相关的事情,而这根本行不通。或者它可能会创建多个 UI 线程,这不是一个好主意。 UI 类只能从关联的 UI 线程访问。所以我会重新考虑首先使用线程的整个计划。

【讨论】:

我对线程和任务很陌生。我正在下载视频链接以在我的屏幕上运行。首先它下载文件将其保存到本地磁盘,然后在相应的屏幕上重复播放。在这里,您建议我如何同时为 N 个屏幕执行此操作。 @Malik Mehmood 我的建议是远离多线程,除非您熟悉风险。从单个 UI 线程更新多个窗口应该可以正常工作,所以从它开始。【参考方案2】:
Thread thr = new Thread(() => playContent(src,computerscreen));
thr.Start();

【讨论】:

您能否仅解释邮政编码以外的答案?

以上是关于创建线程时出现编译时错误的主要内容,如果未能解决你的问题,请参考以下文章

不确定为啥在使用 SQLAlchemy 时出现线程 ID 错误

使用 pthread_create 时出现“分段错误(核心转储)”

Android:当我使用 AsyncTask 时出现“调用线程必须是准备好的 Looper 线程”错误

“调用线程无法访问此对象,因为不同的线程拥有它”从 WPF 中的不同线程更新 UI 控件时出现错误

处理删除命令时出现分段错误

在 TCP 服务器中使用 pthread_create 时出现错误 11