天道酬勤,学无止境

Task when all, connection is closing

I'm trying to execute multiple SqlDataReaders using Task.WhenAll. But when the tasks are awaited I get

"System.InvalidOperationException: Invalid operation. The connection is closed".

Creation of tasks:

        List<Task<SqlDataReader>> _listTasksDataReader = new List<Task<SqlDataReader>>();
        _listTasksDataReader.Add(GetSqlDataReader1(10));
        _listTasksDataReader.Add(GetSqlDataReader2(10));
        SqlDataReader[] _dataReaders = await Task.WhenAll(_listTasksDataReader);

My "SqlDataReader" methods:

    public Task<SqlDataReader> GetSqlDataReader1(int recordCount)
    {
        using (var sqlCon = new SqlConnection(ConnectionString))
        {
            sqlCon.Open();
            using (var command = new SqlCommand("sp_GetData", sqlCon))
            {
                command.Parameters.Clear();
                command.Parameters.Add(new SqlParameter("@recordCount", recordCount));
                command.CommandType = System.Data.CommandType.StoredProcedure;
                return command.ExecuteReaderAsync();
            }
        }
    }

Shouldn't the database connections be opened when the Task.WhenAll is executed or am I missing something?

评论

UPDATE: I'm going to leave this here, but I've just remembered that you're not allowed to combine yield and await... at least, not yet.


Remember that calling command.ExecuteReaderAsync(), even with the return keyword, doesn't stop execution of the method. That's the whole point of _Async() methods. So immediately after that function call, the code exits the using block. This has the effect of disposing your connection object before you ever have a chance to use it to read from your DataReader.

Try returning an Task<IEnumerable<IDataRecord>> instead:

public async Task<IEnumerable<IDataRecord>> GetSqlDataReader1(int recordCount)
{
    using (var sqlCon = new SqlConnection(ConnectionString))
    using (var command = new SqlCommand("sp_GetData", sqlCon))
    {
        command.Parameters.Add("@recordCount", SqlDbType.Int).Value = recordCount;
        command.CommandType = System.Data.CommandType.StoredProcedure;

        sqlCon.Open();               
        var rdr = await command.ExecuteReaderAsync();
        while (rdr.Read())
        {
             yield return rdr;
        }
    }
}

Note that there is a "gotcha" with this pattern. Each yield return uses the same object, and therefore some weird things can happen if you aren't careful. I recommend further changing this include code that puts the data from each record in the rdr object into it's own (strongly-typed) object instance:

public async Task<IEnumerable<SomeObject>> GetSqlDataReader1(int recordCount)
{
    using (var sqlCon = new SqlConnection(ConnectionString))
    using (var command = new SqlCommand("sp_GetData", sqlCon))
    {
        command.Parameters.Add(new SqlParameter("@recordCount", recordCount));
        command.CommandType = System.Data.CommandType.StoredProcedure;

        sqlCon.Open();                
        var rdr = await command.ExecuteReaderAsync();
        while (rdr.Read())
        {
             yield return new SomeObject() {Field1 = rdr[1], Field2 = rdr[2], etc};
        }
    }
}

It is possible to pass a CommandBehavior.CloseConnection to the ExecuteReaderAsync. Then the connection will remain open until the returned datareader object is closed: see MSDN here and here. In that case, the SqlConnection does not need to be in a using statement.

Like this:

public Task<SqlDataReader> GetSqlDataReader1(int recordCount)
{
    var sqlCon = new SqlConnection(ConnectionString);
    sqlCon.Open();

    using (var command = new SqlCommand("sp_GetData", sqlCon))
    {
        command.Parameters.Clear();
        command.Parameters.Add(new SqlParameter("@recordCount", recordCount));
        command.CommandType = System.Data.CommandType.StoredProcedure;
        return command.ExecuteReaderAsync(CommandBehavior.CloseConnection);
    }
}

am I missing something?

You're trying to get a SqlDataReader that doesn't have an underlying connection? I don't think that will work well. What happens as you read from the reader? The connection is already closed.

So, you probably just need to read the actual data before closing the connection:

public async Task<List<T>> GetData1(int recordCount)
{
    using (var sqlCon = new SqlConnection(ConnectionString))
    {
        sqlCon.Open();
        using (var command = new SqlCommand("sp_GetData", sqlCon))
        {
            command.Parameters.Clear();
            command.Parameters.Add(new SqlParameter("@recordCount", recordCount));
            command.CommandType = System.Data.CommandType.StoredProcedure;

            var result = new List<T>();
            var reader = await command.ExecuteReaderAsync();
            // TODO: use `reader` to populate `result`
            return result;
        }
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 异步检测断开挂起(Asyncio detecting disconnect hangs)
    问题 我在 Python 3.4 中使用 Asyncio,我将尝试解释我目前在做什么以及我(认为)是什么导致了这个问题。 一方面,我有一个带有阻塞操作的 UDP 连接框架,我从这个流中获取数据并创建我以 SSE 格式传递给客户端的 json。 这一切都很好。 我遇到的问题是,如果我不做任何事情并且客户端断开连接,我将无法正确处理客户端断开连接,我将开始收到此错误: WARNING [selector_events:613] socket.send() raised exception. 由于循环仍在运行,我一直在寻找干净地中断循环并触发 .close() 的方法,但我遇到了我发现的示例问题,而且网上资源并不多。 一个似乎实际可行的示例是尝试从客户端读取一行,如果它是一个空字符串,则表示客户端已断开连接。 while True: data = (yield from client_reader.readline()) if not data: #client disconnected break 但是,在大约十条消息后,所有发送到客户端的消息都停止了,我认为这是因为它挂在“data = (yield from client_reader.readline())”上,如果我关闭客户端然后它会正确关闭并“结束连接”确实被调用。 任何想法为什么它可能会挂? 我认为在这一点上我对
  • MySQL C#异步方法不起作用?(MySQL C# async methods doesn't work?)
    问题 我在服务器中有一个数据库,看来异步方法不起作用。 这是我的代码: static async void Example() { string connectionString = "Server=mydomainname.com;" + "Port=3306;" + "Database=scratch;" + "Uid=Assassinbeast;" + "Password=mypass123;" + "AllowUserVariables= true;"; MySql.Data.MySqlClient.MySqlConnection sqConnection = new MySql.Data.MySqlClient.MySqlConnection(connectionString); await sqConnection.OpenAsync(); Console.Write("Opened. Now Click to close"); Console.ReadLine(); sqConnection.Close(); } static void Main(string[] args) { Console.ReadLine(); Example(); Console.WriteLine("Done"); Console.ReadLine(); } 在“ await”语句中
  • 多次打开和关闭 SQL 连接有多糟糕? 具体效果如何?(How bad is opening and closing a SQL connection for several times? What is the exact effect?)
    问题 例如,我需要使用 SQLDataAdapter 的 Fill() 方法填充大量数据表: DataAdapter1.Fill(DataTable1); DataAdapter2.Fill(DataTable2); DataAdapter3.Fill(DataTable3); DataAdapter4.Fill(DataTable4); DataAdapter5.Fill(DataTable5); .... .... 即使所有的数据适配器对象都使用相同的 SQLConnection,每个 Fill 方法都会打开和关闭连接,除非在方法调用之前连接状态已经打开。 我想知道的是,不必要地打开和关闭 SQLConnections 如何影响应用程序的性能。 需要扩展多少才能看到此问题的不良影响(100,000 个并发用户?)。 在一个中等规模的网站(每天 50000 个用户)中,是否值得费心和搜索所有 Fill() 调用,将它们放在代码中并在任何 Fill() 调用之前打开连接并在之后关闭? 回答1 ADO.NET 具有连接池,例如,当您关闭一个连接时,它并不是真正完全关闭,而是“回收”,如果您要求一个具有完全相同连接字符串的新连接。 尽管如此 - 如果您已经提前知道必须一一调用这五个 Fill 方法,我肯定会推荐 打开连接从数据库中读取所有五个数据表立即再次关闭连接
  • 带有取消令牌的NetworkStream.ReadAsync永远不会取消(NetworkStream.ReadAsync with a cancellation token never cancels)
    问题 这里的证明。 知道这段代码有什么问题吗? [TestMethod] public void TestTest() { var tcp = new TcpClient() { ReceiveTimeout = 5000, SendTimeout = 20000 }; tcp.Connect(IPAddress.Parse("176.31.100.115"), 25); bool ok = Read(tcp.GetStream()).Wait(30000); Assert.IsTrue(ok); } async Task Read(NetworkStream stream) { using (var cancellationTokenSource = new CancellationTokenSource(5000)) { int receivedCount; try { var buffer = new byte[1000]; receivedCount = await stream.ReadAsync(buffer, 0, 1000, cancellationTokenSource.Token); } catch (TimeoutException e) { receivedCount = -1; } } } 回答1 我终于找到了解决方法。 使用Task
  • Java Socket编程
    一篇很不错的Java Socket编程的博客,转自:http://haohaoxuexi.iteye.com/blog/1979837Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket。服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了。首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket了,客户端和服务端各一个。 对于Socket之间的通信其实很简单,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。下面来看一些服务端与客户端通信的例子: 1、客户端写服务端读 服务端代码 Java代码 public class Server { public static void main(String args[]) throws IOException { //为了简单起见,所有的异常信息都往外抛 int port = 8899; /
  • Celery Worker数据库连接池(Celery Worker Database Connection Pooling)
    问题 我正在独立使用Celery(不在Django中)。 我打算让一种工作程序任务类型在多台物理计算机上运行。 该任务执行以下操作 接受一个XML文档。 转换它。 进行多个数据库读写。 我使用的是PostgreSQL,但这同样适用于使用连接的其他商店类型。 过去,我使用数据库连接池来避免在每个请求上创建新的数据库连接,或者避免保持连接打开时间过长。 但是,由于每位Celery工作人员都在一个单独的进程中运行,因此我不确定他们实际上将如何共享池。 我想念什么吗? 我知道Celery允许您保留从Celery工作者返回的结果,但这不是我要在这里做的。 每个任务可以执行不同的更新或插入操作,具体取决于处理的数据。 从Celery工作者内部访问数据库的正确方法是什么? 是否可以在多个工作程序/任务之间共享一个池,或者是否有其他方法可以做到这一点? 回答1 我喜欢tigeronk2的每个工人一个连接的想法。 正如他所说,Celery维护自己的工作人员池,因此实际上不需要单独的数据库连接池。 Celery Signal文档说明了创建工作程序时如何进行自定义初始化,因此我将以下代码添加到我的task.py中,它的工作方式完全符合您的期望。 当工作人员关闭时,我什至能够关闭连接: from celery.signals import worker_process_init, worker
  • Asyncio detecting disconnect hangs
    I'm using Asyncio in Python 3.4, I'll try to explain what I'm doing to this point and what I (think) is causing the issue. On one end I have a UDP connection framework with blocking operations, I'm taking the data I get from this stream and creating json that I pass out to the client in SSE format. This is all working great. The issue I'm running into is that I can't get it to handle client disconnects properly if I don't do anything and a client disconnects I'll start getting this error: WARNING [selector_events:613] socket.send() raised exception. since the loop is still running, I've been
  • 如何使用Ansible重启CentOS 7?(How to reboot CentOS 7 with Ansible?)
    问题 我正在尝试重新启动在VirtualBox上运行CentOS 7服务器。 我使用此任务: - name: Restart server command: /sbin/reboot async: 0 poll: 0 ignore_errors: true 服务器重新启动,但出现此错误: TASK: [common | Restart server] *********************************************** fatal: [rolcabox] => SSH Error: Shared connection to 127.0.0.1 closed. It is sometimes useful to re-run the command using -vvvv, which prints SSH debug output to help diagnose the issue. FATAL: all hosts have already failed -- aborting 我究竟做错了什么? 我怎样才能解决这个问题? 回答1 您可能并没有做任何真正错误的事情,只是/ sbin / reboot如此迅速地关闭了服务器,以至于在Ansible本身可以关闭它之前,服务器已经断开了Ansible使用的SSH连接。 结果,Ansible报告了一个错误
  • 重头戏!ZeroMQ的管道模式详解:ZMQ_PUSH、ZMQ_PULL
    一、ØMQ模式总览 ØMQ支持多种模式,具体可以参阅:https://blog.csdn.net/qq_41453285/article/details/106865539本文介绍ØMQ的管道模式 二、管道模式 管道模式在有的地方也称为“流水线”模式管道模式用于将数据分发到布置在流水线中的节点。数据始终沿流水线向下流动,流水线的每一级都连接到至少一个节点。当流水线级连接到多个节点时,数据在所有连接的节点之间进行轮询管道模式由http://rfc.zeromq.org/spec:30正式定义“管道模式”支持的套接字类型有4种: ZMQ_PUSHZMQ_PULL 三、“PUSH-PULL”套接字类型 ZMQ_PUSH 管道节点使用类型为ZMQ_PUSH的套接字将消息发送到下游流水线节点。消息循环到所有连接的下游节点该套接字类型不支持zmq_msg_recv()等接收数据的函数当ZMQ_PUSH套接字由于已达到所有下游节点的高水位线而进入静音状态时,或者如果根本没有下游节点,则套接字上的任何zmq_send()操作都应阻塞,直到静音状态结束或处于至少一个下游节点可用于发送;消息不会被丢弃 ZMQ_PUSH特性摘要 兼容的对等套接字ZMQ_PULL方向单向发送/接收模式仅发送入网路由策略不适用(N/A) 外发路由策略 轮询静音状态下的操作阻塞 MQ_PULL 管道节点使用ZMQ
  • signalR tracking connected users
    I need to check whether a specific user is still connected. I have the following HashSet that keeps track of users: public static class UserHandler { public static HashSet<string> ConnectedIds = new HashSet<string>(); } So on disconnected: public override Task OnDisconnected() { UserHandler.ConnectedIds.Remove(this.Context.ConnectionId); if (UserHandler.ConnectedIds.Count == 0) { // STOP TASK -> SET CANCELLATION } return base.OnDisconnected(); } and on Connected: public override Task OnConnected() { Logger.Log.file.Info("[TaskActionStatus HUB => OnConnected] Start"); UserHandler.ConnectedIds
  • Swoole.001.手撸网络服务器模型
    Swoole进程结构 Master进程: 主进程 Manger进程: 管理进程 Worker进程: 工作进程 Task进程: 异步任务工作进程 github: https://github.com/masterzcw/swoole/tree/master/swoole/server Master进程 第一层, Master进程, 这个是swoole的主进程,这个进程是用于处理swoole的核心事件驱动的, 那么在这个进程当中可以看到它拥有一个MainReactor[线程]以及若干个Reactor[线程], swoole所有对于事件的监听都会在这些线程中实现, 比如来自客户端的连接, 信号处理等. 1.1 MainReactor(主线程) 主线程会负责监听server socket, 如果有新的连接accept, 主线程会评估每个Reactor线程的连接数量. 将此连接分配给连接数最少的reactor线程, 做一个负载均衡. 1.2 、Reactor线程组 Reactor线程负责维护客户端机器的TCP连接、处理网络IO、收发数据完全是异步非阻塞的模式. swoole的主线程在Accept新的连接后, 会将这个连接分配给一个固定的Reactor线程, 在socket可读时读取数据, 并进行协议解析, 将请求投递到Worker进程. 在socket可写时将数据发送给TCP客户端. 1.3
  • 用云压力测试工具,如何完成一次测试任务
    Cloud Performance Test 云压力测试平台(以下简称:CPT)可以提供一站式全链路云压力测试服务,通过分布式压力负载机,快速搭建系统高并发运行场景,按需模拟千万级用户实时访问,并结合系统资源状态,评估系统承载能力,快速定位系统性能瓶颈。而测试任务是云压力测试平台的重要组成部分,脚本调试成功后,用户可以在测试任务页面选择压测脚本、编辑用户曲线、选择压测节点,保存后可以执行任务查看压测结果。 需要工具:进入睿象云官网,注册账户信息,找到“Cloud Performance Test 云压力测试平台”即可开始进行一次云压力测试之旅。 测试任务页面包含6个主要区域:01-测试任务新建、选择区,02-测试脚本选择区,03-用户曲线编辑区,04-压测节点选择区,05-压测节点编辑区,06-监测主机选择区,07-运行设置,08-任务执行; 测试任务新建、选择区 · 通过点击测试任务右侧的 new 或者 + 按钮,创建测试任务 测试脚本选择区 · 测试脚本选择区,显示脚本列表,右上角展示 已选择脚本数量/可选择脚本数量 ; · 选择脚本后,可以点击 平均分配 按钮,平均分配脚本比例,也可以手动输入脚本比例; · 脚本比例之和必须等于【100%】,否则无法保存测试任务。 用户曲线编辑区 用户曲线编辑区分为三个部分:第一部分是用户爬升区;第二部分是用户平台区,第三部分是用户下降区。
  • How to execute background task when Android app is closed / set to background?
    My Android 4+ app is connected to a custom web service that is used to sync data every few minutes. To make sure, that the online data is always up to date, I want to trigger the sync when ever the app is closed / send to background. Under iOS this is quite easy: Listen to applicationDidEnterBackground: in the AppDelegate Use beginBackgroundTaskWithName: to start you long running background task and to avoid being suspended while the task is still running How to do this on Android? First problem is, that there is nothing equivalent to applicationDidEnterBackground:. All solution I found so far
  • 异步IO-数据库-队列-缓存10
    Python之路,Day10 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销   "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱
  • 通过 async/await 进行服务器通信?(Server communication via async/await?)
    问题 我想通过 async/await 创建通过 TAP 发送的 Socket 消息。 在阅读了这个答案和这个答案之后 - 我决定创建一个完整的示例: 那么我尝试了什么: 我从这里(一切正常)采用了 TAP 扩展方法:并在控制台 cmd 中对其进行了测试: 收货人代码 public static class SocketExtensions { public static Task<int> ReceiveTaskAsync(this Socket socket, byte[] buffer, int offset, int count) { return Task.Factory.FromAsync<int>( socket.BeginReceive(buffer, offset, count, SocketFlags.None, null, socket), socket.EndReceive); } public static async Task<byte[]> ReceiveExactTaskAsync(this Socket socket, int len) { byte[] buf = new byte[len]; int totalRead = 0; do{ int read = await ReceiveTaskAsync(socket, buf
  • Android Emulator无法运行从Eclipse启动的应用程序(Android Emulator won't run application started from eclipse)
    问题 我遵循了Google Android开发人员指南中的“ Hello World”示例。 当我尝试在SDK仿真器中运行应用程序时,没有任何反应。 模拟器可以很好地启动,但是此后什么也没发生。 我什至在应用程序托盘中都看不到该应用程序。 我正在使用安装了Android附加组件的Eclipse。 回答1 同样在这里; 模拟器加载正常,但未安装apk。 问题仅在于仿真器。 如果在打开USB调试的情况下物理连接设备,则一切正常。 注意:这突然开始,没有明显的原因。 过去一切正常。 我尝试卸载并重新安装ADT插件,并将Android SDK和AVD Manager更新为最新版本。 (工具修订版7),但问题仍然存在。 Eclipse:Helios Service Release 1内部版本号:20100917-0705在Windows XP SP2上运行 就像其他人发布的一样,控制台日志显示 [2010-10-14 11:39:33 - uad-MediaPlayerExample] ------------------------------ [2010-10-14 11:39:33 - uad-MediaPlayerExample] Android Launch! [2010-10-14 11:39:33 - uad-MediaPlayerExample] adb is running
  • 如何设置TcpClient的超时时间?(How to set the timeout for a TcpClient?)
    问题 我有一个TcpClient,用于将数据发送到远程计算机上的侦听器。 远程计算机有时会打开,有时会关闭。 因此,TcpClient将经常无法连接。 我希望TcpClient一秒钟后超时,因此当它无法连接到远程计算机时不需要花费很多时间。 当前,我将以下代码用于TcpClient: try { TcpClient client = new TcpClient("remotehost", this.Port); client.SendTimeout = 1000; Byte[] data = System.Text.Encoding.Unicode.GetBytes(this.Message); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); data = new Byte[512]; Int32 bytes = stream.Read(data, 0, data.Length); this.Response = System.Text.Encoding.Unicode.GetString(data, 0, bytes); stream.Close(); client.Close(); FireSentEvent(); //Notifies of success }
  • 连接关闭后继续 php 脚本(Continue php script after connection close)
    问题 我试图在页面/连接关闭后继续一个 PHP 脚本。 用户会每隔 1 小时 POLL 脚本,我想返回一些 json 输出并希望在后台继续脚本。 我正在使用共享主机,但无法使用 cron 作业。 这是我尝试过的。 ob_start(); ignore_user_abort(); echo "JSON_OUTPUT GOES HERE"; $ob_length = ob_get_length(); header("Content-Type : text/plain",TRUE); header("Content-Length : $ob_length",TRUE); header("Connection : Close",TRUE); flush(); ob_flush(); ob_end_flush(); sleep(3); echo "You cant see me.."; exit(); 我正在使用 Codeigniter 框架,但它在我的实时服务器上不起作用。 它等待 3 秒钟,然后输出You cant see me.. too。 请帮我。 笔记 项目托管在 LINUX/WINDOWS/WAMP-SERVER 共享主机上。 回答1 经过一些研究,我得到了它的工作,有时它可能对其他人有用。 function closeOutput($stringToOutput){ set
  • For循环会导致Task.Run或Task.Start溢出(For Loop result in Overflow with Task.Run or Task.Start)
    问题 有一个问题,希望有人可以帮助我。 我尝试在循环中启动4个任务,但即时通讯收到ArgumentOutOfRangeException: for (int i = 0; i < 4; i++) { //start task with current connection tasks[i] = Task<byte[]>.Run(() => GetData(i, plcPool[i])); } 因为i = 4,所以循环出现溢出 如果我不带循环地启动任务,则它们运行时不会出现任何问题: tasks[0] = Task<byte[]>.Run(() => GetData(0, plcPool[0])); tasks[1] = Task<byte[]>.Run(() => GetData(1, plcPool[1])); tasks[2] = Task<byte[]>.Run(() => GetData(2, plcPool[2])); tasks[3] = Task<byte[]>.Run(() => GetData(3, plcPool[3])); 不知道为什么? 通过套接字连接从Siemens PLC获得Tasks GetData。 PLC最多支持32个连接。 每个连接我收到200个字节。 private byte[] GetData(int id, PLC plc) {
  • Exceptions when rolling back a transaction - connection already closed?
    Using Entity Framework 6.0.0, I'm seeing an exception when closing a transaction. We'd been having problems with concurrent changes to the table, so I wrapped it in a transaction, and now I'm getting exceptions on rollback. The code: public LockInfo getSharedLock(string jobid) { using (var myDbContext = new MyDbContext()) { using (var transaction = myDbContext.Database.BeginTransaction()) { try { this.logger.log("Attempting to get shared lock for {0}", jobid); var mylocks = myDbContext.joblocks.Where(j => j.customerid == this.userContext.customerid) .Where(j => j.jobid == jobid) .Where(j => j