Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单独的任务中运行C方法以避免延迟_C#_Asynchronous_Task - Fatal编程技术网

C# 在单独的任务中运行C方法以避免延迟

C# 在单独的任务中运行C方法以避免延迟,c#,asynchronous,task,C#,Asynchronous,Task,我正在开发一个C应用程序。我有一个在应用程序启动时运行的方法,这个方法需要一些时间,因为应用程序启动时有延迟。为了克服这个问题,我想在一个单独的任务/线程中运行该方法,这样我的应用程序就可以启动,并且该方法将继续在单独的线程上运行 我的方法的当前实现是: public void Start() { ManagementObjectCollection ManObjReturn; ManagementObjectSearcher ManObjSearch; ManObjSe

我正在开发一个C应用程序。我有一个在应用程序启动时运行的方法,这个方法需要一些时间,因为应用程序启动时有延迟。为了克服这个问题,我想在一个单独的任务/线程中运行该方法,这样我的应用程序就可以启动,并且该方法将继续在单独的线程上运行

我的方法的当前实现是:

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