首页 > 解决方案 > 创建线程时出现编译时错误

问题描述

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

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)));

标签: c#multithreadingwinforms

解决方案


播放内容(scr,电脑屏幕)

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

尝试将其更改为

新线程(() => playContent(scr,computerscreen));

但是,我会主张使用任务而不是原始线程。几乎没有一个很好的理由来创造一个Thread你自己。IE

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

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


推荐阅读