You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#创建Thread线程时触发"Method Name Expected"编译错误如何解决

问题解决方案

错误原因

你收到"Method Name Expected"报错的核心原因是:ThreadStart委托要求传入无参数的方法引用,而你直接写playContent(scr, computerscreen)是直接执行方法并传入返回值,不符合委托的参数要求。

修复步骤

  1. 用lambda表达式包装带参数的方法调用,适配ThreadStart委托的参数要求
  2. 修复foreach循环的闭包捕获问题,避免多个线程拿到的参数是同一个循环变量的最终值
  3. 给操作UI的线程设置STA线程模式(WinForm窗体要求运行在STA线程下)
  4. 调用Start()方法启动线程,原代码只声明了线程没有启动
  5. 所有UI相关操作必须在对应控件的创建线程上执行,新线程内独立创建窗体的场景只要设置STA模式即可正常运行

修复后的核心代码

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)
            {
                // 声明临时变量存储当前循环的参数,避免闭包捕获问题
                var currentScr = scr;
                var currentScreen = computerscreen;
                Thread thr = new Thread(new ThreadStart(() => playContent(currentScr, currentScreen)));
                // WinForm窗体需要运行在单线程单元(STA)模式下
                thr.SetApartmentState(ApartmentState.STA);
                // 启动线程
                thr.Start();
            }
        }
    }
}

额外优化建议

  • playContent方法里的apiOperation.DownLoadFile(...).Result会阻塞线程,建议改成异步写法,用await避免线程阻塞
  • 可以在PlayerForm关闭后手动结束对应线程,避免后台线程残留

内容的提问来源于stack exchange,提问作者Malik Mehmood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:36:02