C# 在单独的任务中运行C方法以避免延迟
我正在开发一个C应用程序。我有一个在应用程序启动时运行的方法,这个方法需要一些时间,因为应用程序启动时有延迟。为了克服这个问题,我想在一个单独的任务/线程中运行该方法,这样我的应用程序就可以启动,并且该方法将继续在单独的线程上运行 我的方法的当前实现是:C# 在单独的任务中运行C方法以避免延迟,c#,asynchronous,task,C#,Asynchronous,Task,我正在开发一个C应用程序。我有一个在应用程序启动时运行的方法,这个方法需要一些时间,因为应用程序启动时有延迟。为了克服这个问题,我想在一个单独的任务/线程中运行该方法,这样我的应用程序就可以启动,并且该方法将继续在单独的线程上运行 我的方法的当前实现是: public void Start() { ManagementObjectCollection ManObjReturn; ManagementObjectSearcher ManObjSearch; ManObjSe
public void Start()
{
ManagementObjectCollection ManObjReturn;
ManagementObjectSearcher ManObjSearch;
ManObjSearch = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\"");
ManObjReturn = ManObjSearch.Get();
foreach (ManagementObject ManObj in ManObjReturn)
{
string name = ManObj["Name"].ToString();
int i = name.LastIndexOf('(');
string port = name.Substring(i + 1, name.Length - i - 2);
string man = ManObj["Manufacturer"].ToString();
for (int x = 0; x < allComPorts.Count; x++)
{
if (string.Equals(man, "FTDI") && string.Equals(port, UsbState.allComPorts[x]))
{
FtdiDevice ftdiDevice = new FtdiDevice() { ComPortName = allComPorts[x] };
existingFtdiPorts.Add(ftdiDevice);
OnDeviceAttached(this, new FtdiDeviceEventArgs() { ftdiDevice = ftdiDevice });
break;
}
}
}
BackgroundWorker bgwUsbDeviceDetector = new BackgroundWorker();
bgwUsbDeviceDetector.DoWork += UsbDeviceDetection;
bgwUsbDeviceDetector.RunWorkerAsync();
bgwUsbDeviceDetector.WorkerReportsProgress = true;
bgwUsbDeviceDetector.WorkerSupportsCancellation = true;
}
在google上搜索之后,我得到的是我们可以使用Task.Run在单独的任务/线程上运行
现在我的更新代码是:
public void Start()
{
Task.Run(() => (
ManagementObjectCollection ManObjReturn;
ManagementObjectSearcher ManObjSearch;
ManObjSearch = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\"");
ManObjReturn = ManObjSearch.Get();
foreach (ManagementObject ManObj in ManObjReturn)
{
string name = ManObj["Name"].ToString();
int i = name.LastIndexOf('(');
string port = name.Substring(i + 1, name.Length - i - 2);
string man = ManObj["Manufacturer"].ToString();
for (int x = 0; x < allComPorts.Count; x++)
{
if (string.Equals(man, "FTDI") && string.Equals(port, UsbState.allComPorts[x]))
{
FtdiDevice ftdiDevice = new FtdiDevice() { ComPortName = allComPorts[x] };
existingFtdiPorts.Add(ftdiDevice);
OnDeviceAttached(this, new FtdiDeviceEventArgs() { ftdiDevice = ftdiDevice });
break;
}
}
}
BackgroundWorker bgwUsbDeviceDetector = new BackgroundWorker();
bgwUsbDeviceDetector.DoWork += UsbDeviceDetection;
bgwUsbDeviceDetector.RunWorkerAsync();
bgwUsbDeviceDetector.WorkerReportsProgress = true;
bgwUsbDeviceDetector.WorkerSupportsCancellation = true;
)
}
但这不起作用,我得到的错误是ManagementObjectCollection是一种在给定上下文中无效的类型
有人能帮我吗?我知道我遗漏了一些关于任务和如何使用它们的非常简单的东西,但如果有任何帮助,我将不胜感激。基于您的需要,我将为您提供类似的帮助
public async Task<yourType> MyMethod()
{
...your code...
return await Task.Run(()=> yourType.-any extension method if you need it-;)
}
你从哪里拉=>来?它应该是lambda箭头右边的一个大括号。在你修正了打字错误后,移除BackgroundWorker。你已经在后台运行了一些东西,你根本不需要BGW。它引发的任何事件进度事件都将在任务的回退线程中引发,这意味着它们无法更新UI。无论UsbDeviceDetection做什么,都可以在这一点上直接调用哦,我犯了一个愚蠢的错误,顺便说一句,谢谢@Damien_The_unsiver。我将检查它是否提高了应用程序的性能。我认为您可以使用异步等待模式,而不是使用Task.Run。如果我记得的话,先检查一下你的c的版本。必须至少是版本5-我不确定-使用它。因此,在方法中编写代码。类似于:'公共异步任务MyMethodAsync{code…}。别忘了在里面放一个wait关键字。或者返回类似这样的内容:“return wait Task.Run=>yourReturnType;”我想我不能在这种情况下使用Async await,因为我没有任何操作来等待@BerBar