Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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# 使用异步任务检查Excel中数字的性能_C#_Multithreading_Excel_Asynchronous - Fatal编程技术网

C# 使用异步任务检查Excel中数字的性能

C# 使用异步任务检查Excel中数字的性能,c#,multithreading,excel,asynchronous,C#,Multithreading,Excel,Asynchronous,我制作了一个简单的验证方法,检查单元格中的数据是否为数字 public async void checkNumberMethod(Excel.Range numericRange, bool isCompulsary) { int errorCnt = await checkNumberAsync( numericRange, colTable, isCompulsary); } private Task<int> checkNumberAsync(Excel.Ra

我制作了一个简单的验证方法,检查单元格中的数据是否为数字

public async void checkNumberMethod(Excel.Range numericRange,  bool isCompulsary)
{
    int errorCnt = await checkNumberAsync( numericRange,  colTable,  isCompulsary);

}

private Task<int> checkNumberAsync(Excel.Range numericRange,  bool isCompulsary)
{

    return Task.Run<int>(() => checkNumber(numericRange,isCompulsary));
}

private int checkNumber(Excel.Range numericRange,  bool isCompulsary)
{
    if (isCompulsary == true)
    {
        foreach(Excel.Range item in numericRange)
        {
            //Do stuff
        }
    }
    else
    {
        foreach(Excel.Range item in numericRange)
        {
             //Do stuff
        }
    }
}
但这比打电话慢得多

checkNumber( numericRange,  true);
checkNumber( numericRange,  false);
任务并不总是更快?

如果你能给我一些建议,我将非常感激

是的,
任务
并不总是比直接调用方法更快。让我们深入了解您的代码,看看这里发生了什么:

您正在调用
checkNumberMethod
并异步启动内部方法,然后.NET创建和机器状态,该状态将在任务完成后加载。内部有一个另一个
任务
,它需要在线程池的后台运行资源


所以,若您的工作很短,
async/await
降低程序的速度-状态机创建的开销和任务后台运行是一个常量值,它将始终在您的程序中,即使对于即时方法也是如此。

是的,
task
并不总是比直接调用该方法更快。让我们深入了解您的代码,看看这里发生了什么:

您正在调用
checkNumberMethod
并异步启动内部方法,然后.NET创建和机器状态,该状态将在任务完成后加载。内部有一个另一个
任务
,它需要在线程池的后台运行资源


所以,若您的工作很短,
async/await
降低程序的速度-状态机创建的开销和任务后台运行是一个常量值,它将始终在您的程序中,即使对于即时方法也是如此。

不,任务不会更快。它与性能无关,只是意味着它是并行运行的。如果您正在等待它完成,那么除了开销之外,您从并行性中什么也得不到

不,任务不是更快。它与性能无关,只是意味着它是并行运行的。如果您正在等待它完成,那么除了开销之外,您从并行性中什么也得不到

正如其他人指出的那样,使用
任务
不一定会更快,但在客户机上,它可以让您将工作推到后台,并让客户保持响应。使用TPL,您还可以并行处理结果,这可以更快。例如

numericRange.AsParallel().ForAll(() => /* check each number*/);
PLINQ的
aspallel
以及
并行。ForEach
允许您并行处理数据。有一些关于这个主题的博客


当您调用异步IO操作时,
任务
甚至更好,因为它们允许您释放当前线程来做其他工作。

正如其他人所指出的,使用
任务
并不一定更快,但在客户端上,它可以让您将工作推到后台并保持客户端的响应。使用TPL,您还可以并行处理结果,这可以更快。例如

numericRange.AsParallel().ForAll(() => /* check each number*/);
PLINQ的
aspallel
以及
并行。ForEach
允许您并行处理数据。有一些关于这个主题的博客


当您调用异步IO操作时,
任务
甚至更好,因为它们允许您释放当前线程来做其他工作。

这是我不喜欢COM为您执行线程的方式的一个主要原因。在本例中,
Excel.Range
是一个STA COM组件,它将执行自动线程封送,以尝试“帮助”

每次您尝试从另一个上下文中使用STA组件时,STA组件都会同步回它们所属的线程。因此,在本例中,您的代码将一些工作发送到后台线程,然后后台工作将不断转向并同步到您背后的UI线程

您可以将STA内容从“实际工作”中分离出来,例如,在调用
任务之前,将所需的
范围
数据复制到常规的
列表
。运行
。但是,您仍然需要考虑这里的其他答案:即,如果您只有少量的工作,将它推到后台线程只会增加开销。
最后,请记住,“异步”并不意味着“更快”。异步只是在不使用多线程的情况下执行多个操作的一种方式。

这是我不喜欢COM为您执行线程的一个主要原因。在本例中,
Excel.Range
是一个STA COM组件,它将执行自动线程封送,以尝试“帮助”

每次您尝试从另一个上下文中使用STA组件时,STA组件都会同步回它们所属的线程。因此,在本例中,您的代码将一些工作发送到后台线程,然后后台工作将不断转向并同步到您背后的UI线程

您可以将STA内容从“实际工作”中分离出来,例如,在调用
任务之前,将所需的
范围
数据复制到常规的
列表
。运行
。但是,您仍然需要考虑这里的其他答案:即,如果您只有少量的工作,将它推到后台线程只会增加开销。
最后,请记住,“异步”并不意味着“更快”。异步只是在不使用多线程的情况下执行多项任务的一种方式。

为什么运行一个异步方法等待一个运行调用最终方法的任务的方法会比只调用最终方法更快?如果您并行创建多个任务(或者允许您在任务完成时运行其他代码),这只会更快(并且“可能”更快,具体取决于许多条件)。仅仅一个任务永远不会更快,因为仅仅调用并等待最后一个方法执行会有很多开销。你基本上是c