运行数据库查询而不是等待结果

时间:2014-05-12 13:12:14

标签: c# database loops c#-4.0 parallel-processing

我需要调用存储过程来完成相当多的工作。

我希望能够解雇并忘记"例如,在移动到下一条记录之前不要等待存储过程的响应,因为这会减慢速度,我需要快速移动。

在C#中调用存储过程的最佳方法是什么,而不是等待结果,返回成功状态,然后移动到下一条记录。

我希望能够快速遍历我的选择对象列表并调用一些执行数据库调用的方法,而无需等待响应,然后再转到循环中的下一个项目。

它使用的是C#4.5。

我正在考虑使用像

这样的东西
Parallel.ForEach(sqlRecordset.AsEnumerable(), recordsetRow =>
{
  // get data for selection
  // call DB to save without waiting for response / success/failure status
}

但我不知道这是否是最佳方法。

想法?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

Parallel.ForEach 并行但同步 - 它将等待所有迭代完成。

您可以使用TPL (Task Parallel Library)来实现您的目标:

foreach (var recordsetRow_doNotUse in sqlRecordset.AsEnumerable())
{
    var recordsetRow = recordsetRow_doNotUse;
    Task.Run(() => { 
        Console.WriteLine(recordsetRow);
        /* or do whatever you want with it here */ 
    });
}

Task.Run返回一个任务,所以如果你需要在完成所有这些任务后做一些事情,你可以将它们全部放在一个数组中,然后使用Task.WhenAll来获取一个任务,当它完成时所有迭代都完成,不会阻塞任何线程。

P.S。我不知道C#4.5的含义,可能是.NET 4.5,即C#5。上面的示例代码不能使用早期版本的C#。

答案 1 :(得分:3)

更简单的方法是使用ADO.NET:

var cmd = new SqlCommand("storeProcName", sqlConnection);
cmd.CommandType = CommandType.StoredProcedure;

cmd.BeginExecuteNonQuery();

答案 2 :(得分:0)

由于您希望遍历每个记录,获取一些值并将其存储在数据库中而不是等待任何记录集,您可以执行以下操作;假设您正在使用Windows应用程序并且知道线程;

foreach (DataRow row in DataTable.Rows) //you can use any enumerable object here
{
    string s = row.Fields("name").ToString();
    Thread t = new Thread(new ParameterizedThreadStart(SaveName));
    t.IsBackground = true;
    t.start(s);
}

public void SaveName(object s)
{
    //your code to save the value in 's'
}

这样,您不必等待数据库响应,并且将保存每个值。一旦完成保存和处理记录,线程就会被销毁。

希望这有帮助。

快乐编码.. !!