Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#_.net_Asp.net_Asynchronous - Fatal编程技术网

在C#中使单个语句异步的最简单方法?

在C#中使单个语句异步的最简单方法?,c#,.net,asp.net,asynchronous,C#,.net,Asp.net,Asynchronous,我在ASP.NET页面上运行了一条语句,这需要很长的时间(我所说的long是指100ms,如果我想让这个页面闪电般地快,这太长了),我不在乎它何时执行,只要它执行就行 实现这一点的最佳(希望也是最简单的)方法是什么?如果您想说响应可以在命令运行之前发送,您可以使用ThreadPool.QueueUserWorkItem在另一个线程上运行它,而不阻塞您的请求。如果您想说响应可以在命令运行之前发送,您可以使用ThreadPool.QueueUserWorkItem在另一个线程上运行它,而不会阻止您的

我在ASP.NET页面上运行了一条语句,这需要很长的时间(我所说的long是指100ms,如果我想让这个页面闪电般地快,这太长了),我不在乎它何时执行,只要它执行就行


实现这一点的最佳(希望也是最简单的)方法是什么?

如果您想说响应可以在命令运行之前发送,您可以使用ThreadPool.QueueUserWorkItem在另一个线程上运行它,而不阻塞您的请求。

如果您想说响应可以在命令运行之前发送,您可以使用ThreadPool.QueueUserWorkItem在另一个线程上运行它,而不会阻止您的请求。

在.NET应用程序的后台处理信息时,有一个后台工作线程非常有用。多一点上下文有助于更好地回答这个问题。

在.NET应用程序的后台处理信息时,有一个后台工作线程非常有用。多了解一些上下文有助于更好地回答这个问题。

如果是100毫秒,那就不用麻烦了。您的用户无法检测到100毫秒的延迟


编辑:一些解释

如果我没记错的话,100毫秒(1/10秒)是人类能够感知的最短时间。因此,为了讨论的目的,让我承认这100毫秒可以被OP网站的用户感知,并且值得将性能提高100毫秒。我从一开始就认为OP已经正确地将这项“长期运行”任务确定为100ms改进的潜在来源。那么,我为什么建议他忽略它呢

正确处理多个线程并不容易,而且是难以追踪的bug的来源。向问题添加线程通常不是解决方案,而是您无法立即找到的其他问题的根源(*)

有一次,我有机会通过艰苦的方式了解到这一点,一个bug只能在当时可用的最快的8个cpu系统上重现,然后只能通过无情地敲打它,同时模拟一定程度的网络故障,这可能会导致网络管理员排队并被枪杀,如果它发生在现实生活中。这个bug原来是在Unix操作系统内核处理信号的过程中出现的,只是一些指令的排列问题

尽管从那以后我从未见过如此糟糕的事情,但我仍然看到许多开发人员被多线程错误绊倒。一方面,这个问题似乎要求通过线程实现“简单的解决方法”,另一方面,好处只有100ms。由于OP似乎还没有经过良好测试的线程基础设施,所以在我看来,忽略100ms或者以其他方式提高性能更有意义



(*)当然,在许多情况下,一个算法可以并行并由多个线程执行,运行在多个核上。但是OP听上去并没有这种情况。

如果是100毫秒,那就不用麻烦了。您的用户无法检测到100毫秒的延迟


// This is the delegate to use to execute the process asynchronously
public delegate void ExecuteBackgroundDelegate();

//
[STAThread]
static void Main(string[] args)
{               
    MyProcess proc = new MyProcess();

    // create an instance of our execution delegate
    ExecuteBackgroundDelegate asynchExec = new ExecuteBackgroundDelegate(proc.Execute);

    // execute this asynchronously
    asynchExec.BeginInvoke(null, null);
}

编辑:一些解释

如果我没记错的话,100毫秒(1/10秒)是人类能够感知的最短时间。因此,为了讨论的目的,让我承认这100毫秒可以被OP网站的用户感知,并且值得将性能提高100毫秒。我从一开始就认为OP已经正确地将这项“长期运行”任务确定为100ms改进的潜在来源。那么,我为什么建议他忽略它呢

正确处理多个线程并不容易,而且是难以追踪的bug的来源。向问题添加线程通常不是解决方案,而是您无法立即找到的其他问题的根源(*)

有一次,我有机会通过艰苦的方式了解到这一点,一个bug只能在当时可用的最快的8个cpu系统上重现,然后只能通过无情地敲打它,同时模拟一定程度的网络故障,这可能会导致网络管理员排队并被枪杀,如果它发生在现实生活中。这个bug原来是在Unix操作系统内核处理信号的过程中出现的,只是一些指令的排列问题

尽管从那以后我从未见过如此糟糕的事情,但我仍然看到许多开发人员被多线程错误绊倒。一方面,这个问题似乎要求通过线程实现“简单的解决方法”,另一方面,好处只有100ms。由于OP似乎还没有经过良好测试的线程基础设施,所以在我看来,忽略100ms或者以其他方式提高性能更有意义



(*)当然,在许多情况下,一个算法可以并行并由多个线程执行,运行在多个核上。但是OP听起来并没有这种情况。

最简单的方法可能是让它在线程池中执行。例如,要使其异步,请执行以下操作:


// This is the delegate to use to execute the process asynchronously
public delegate void ExecuteBackgroundDelegate();

//
[STAThread]
static void Main(string[] args)
{               
    MyProcess proc = new MyProcess();

    // create an instance of our execution delegate
    ExecuteBackgroundDelegate asynchExec = new ExecuteBackgroundDelegate(proc.Execute);

    // execute this asynchronously
    asynchExec.BeginInvoke(null, null);
}
使用制度; 使用系统线程

class Test
{
    static void ExecuteLongRunningTask()
    {
        Console.WriteLine("Sleeping...");
        Thread.Sleep(1000);
        Console.WriteLine("... done");
    }

    static void Main()
    {
        ExecuteLongRunningTask();
        Console.WriteLine("Finished");
        Console.ReadLine();
    }
}
Main
的第一行更改为:

ThreadPool.QueueUserWorkItem(x => ExecuteLongRunningTask());

请注意,如果传入任何参数,它们将被捕获为变量—在某些情况下可能会产生微妙的副作用(特别是在循环中使用时)。

最简单的方法可能是让它在线程池中执行。例如,要使其异步,请执行以下操作:

使用制度; 使用系统线程

class Test
{
    static void ExecuteLongRunningTask()
    {
        Console.WriteLine("Sleeping...");
        Thread.Sleep(1000);
        Console.WriteLine("... done");
    }

    static void Main()
    {
        ExecuteLongRunningTask();
        Console.WriteLine("Finished");
        Console.ReadLine();
    }
}
Main
的第一行更改为:

ThreadPool.QueueUserWorkItem(x => ExecuteLongRunningTask());

请注意,如果传入任何参数,它们将被捕获为变量——在某些情况下可能会产生微妙的副作用(特别是在循环中使用时)。

您可以使用线程池

ThreadPool.QueueUserWorkItem( o => Thread.Sleep(1000) /*your long task*/  );
你可以用Threa