C#创建Thread线程时触发"Method Name Expected"编译错误如何解决
问题解决方案
错误原因
你收到"Method Name Expected"报错的核心原因是:ThreadStart委托要求传入无参数的方法引用,而你直接写playContent(scr, computerscreen)是直接执行方法并传入返回值,不符合委托的参数要求。
修复步骤
- 用lambda表达式包装带参数的方法调用,适配
ThreadStart委托的参数要求 - 修复foreach循环的闭包捕获问题,避免多个线程拿到的参数是同一个循环变量的最终值
- 给操作UI的线程设置STA线程模式(WinForm窗体要求运行在STA线程下)
- 调用
Start()方法启动线程,原代码只声明了线程没有启动 - 所有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
相关产品推荐
相关产品推荐

