Tag: 锁定

如何使用Jet OLEDB打开CSV或XLS并获得表锁?

我试图找出当我通过Jet OLEDB将其作为数据库读取时如何读取/写入锁定CSV或XLS文件。 以下代码将CSV作为DB打开并将其加载到DataTable对象中: private DataTable OpenCSVasDB(string fullFileName) { string file = Path.GetFileName(fullFileName); string dir = Path.GetDirectoryName(fullFileName); string cStr = “Provider=Microsoft.Jet.OLEDB.4.0;” + “Data Source=\”” + dir + “\\\”;” + “Extended Properties=\”text;HDR=Yes;FMT=Delimited\”;”; string sqlStr = “SELECT * FROM [” + file + “]”; OleDbDataAdapter da; DataTable dt = new DataTable(); try { da = new OleDbDataAdapter(sqlStr, cStr); […]

C#文件正由另一个进程使用

我不知道如何解决我的问题。 我不时会收到错误:“进程无法访问文件’xxxx’,因为它正被另一个进程使用”。 这是我发生错误的方法: private static void write_history(int index, int time_in_sec, int[] sent_resources) { string filepath = “Config\\xxx.txt”; int writing_index = 0; if (File.Exists(filepath)) { System.Threading.Thread.Sleep(5000); StreamReader reader = new StreamReader(new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read)); string temp = reader.ReadToEnd(); reader.Close(); for (int i = 0; i < 20; i++) { if (temp.IndexOf("”) == -1) { writing_index […]

为什么这个锁定声明不起作用?

class Program { static object test = new object(); static void Main(string[] args) { new Program().test2(); Console.ReadKey(); } public void test1() { lock (test) { Console.WriteLine(“test1”); } } public void test2() { lock (test) { test1(); Console.WriteLine(“test2”); } } } 上面的代码应该首先在test2()的lock语句中完成语句然后转到test1()吗? (即输出不应该是这样的吗?:test2 test1)

首先对EF代码进行悲观锁定

我想专门锁定我的表中的指定行,因此在实际事务完成之前不会读取任何更新。 为此,我在数据库存储库中创建了一个帮助器类: public void PessimisticMyEntityHandler(Action<IEnumerable> fieldUpdater, string sql, params object[] parameters) { using (var scope = new System.Transactions.TransactionScope()) { fieldUpdater(DbContext.Set().SqlQuery(sql, parameters)); scope.Complete(); } } 这是我的测试代码。 基本上我只是开始两个任务,他们都尝试用Id’1’锁定行。 我的猜测是,第二个任务将无法读取(和更新)该行,直到第一个任务完成其工作,但输出窗口显示它实际上可以。 Task.Factory.StartNew(() => { var dbRepo = new DatabaseRepository(); dbRepo.PessimisticMyEntityHandler(myEntities => { Debug.WriteLine(“entered into lock1”); /* Modify some properties considering the current ones… */ var myEntity = myEntities.First(); Thread.Sleep(1500); […]

Monitor.Pulse&Wait – 意外行为

http://www.codeproject.com/Articles/28785/Thread-synchronization-Wait-and-Pulse-demystified 队列: 就绪队列是等待特定锁的线程集合。 Monitor.Wait方法引入了另一个队列:等待队列。 这是必需的,因为等待Pulse与等待获取锁定不同。 与就绪队列一样,等待队列是FIFO。 推荐图案: 这些队列可能会导致意外行为。 当发生脉冲时,等待队列的头部被释放并被添加到就绪队列中。 但是,如果就绪队列中还有其他线程,则它们将在释放的线程之前获取锁定。 这是一个问题,因为获取锁的线程可以改变脉冲线所依赖的状态。 解决方案是在lock语句中使用while条件 * Q =队列。 通过这个,我明白当我打电话给Pulse ,它会在它结束前做两件事。 首先,它将一个线程从等待Q中移除到就绪Q.其次,它允许Ready Q中的一个线程(不知道谁是该线程)获得锁定; 它不关心谁获取锁(来自等待Q的线程或由于某种原因在准备好的Q中的线程)。 如果我是对的,那么为什么在Monitor.Wait帮助解决问题之前花一点时间(问题 – 即使来自等待Q的线程没有获得锁定,脉冲结束)? A. 告诉我,我是否对Monitor.Pulse的目的是正确的。 B。 为什么我需要在Monitor.Wait之前放一段while 以下答案的完整代码: class Program { static Queue queue = new Queue(); static object someMonitor = new object(); static void Main(string[] args) { Thread Thread1 = new Thread(WorkAlltheTime); Thread1.Name = […]

锁定损坏? 魔术僵局?

我使用multethreading bug。 现在我看到由于某种原因锁定甚至没有被执行但被锁定。 我有下一堂课: public sealed class Foo { private readonly object _lock = new object(); private static ulong _inCnt = 0; public void SomeMethod(ulong poo) { lock (_lock) { _inCnt++; … [some code] } } } 我暂停了VS中的所有线程,检查了所有线程,看到SomeMethod只有一个线程,它正在等待释放lock (_lock) (_inCnt = 0) 。 我恢复线程,等待一段时间,暂停线程并看到相同的图片,同样(并且只有一个)线程仍在等待lock (_lock)的lock (_lock)并且_inCnt为零! 但是如果锁定将会是一个或多个( _inCnt++是lock (_lock)后的第一行lock (_lock)不会发生exception,我们不会中止线程)。 如何将其锁定为零并锁定?

collections被修改; 枚举操作可能无法执行。 锁在哪里可用?

这是一个只有我正在编写和使用的小程序。 现在我要编写所有使用导致此问题的hashset的区域的代码 我不明白这是怎么可能的。 此项目仅在MainWindow中使用 hsProxyList是一个哈希集 HashSet hsProxyList = new HashSet(); 错误发生在下面的迭代中 lock (hsProxyList) { int irRandomProxyNumber = GenerateRandomValue.GenerateRandomValueMin(hsProxyList.Count, 0); int irLocalCounter = 0; foreach (var vrProxy in hsProxyList) { if (irLocalCounter == irRandomProxyNumber) { srSelectedProxy = vrProxy; break; } irLocalCounter++; } } } 我使用hsProxyList的其他地方 我在计算时没有锁定对象 – 我想这不会导致任何错误,但可能不正确 – 不重要 lblProxyCount.Content = “remaining proxy count: ” […]

从Web应用程序创建锁的最佳方法是什么?

我有一个重新调整图像大小的Web应用程序。 重新resize的图像将写入磁盘以缓存它们。 防止多个同时请求生成相同图像的最佳方法是什么? 有几点需要注意,我们有数百万张图像(以兆兆字节为单位)。 删除了一段时间未查看的缓存图像。 我们有一个Web场,但每个Web服务器都有自己的本地缓存(原件存储在另一台服务器上)。 我们还将重新resize的图像放置在第二层缓存中,以便其他Web服务器可以检查图像是否缓存,如果是,则将其复制到本地。 我考虑过使用锁(我发布了一个我正考虑在这里使用的课程)。 但这显然不适用于第二层缓存,我不确定在Web服务器上使用锁是否是一个好主意(虽然我不知道为什么,只是一堆模糊的引用这是一个坏主意)。 我还考虑编写一个临时文件,我可以在开始创建映像之前检查,但我担心Windows不会100%正常清理文件(锁定问题等)。 任何想法都表示赞赏。

lock(this)和lock(thisLock)有什么区别?

我正在读锁定语句(C#参考) ,在那里我看到了这段代码: class Account { private Object thisLock = new Object(); //… int Withdraw(int amount) { lock (thisLock) { //…. } } //… } 我想知道如果我们在上面的例子中写lock(this)而不是lock(thisLock)会有什么不同。 如果你的答案取决于它,请参阅完整的例子 。 如果你认为lock(this)和lock(thisLock)之间确实存在一些差异,那么请帮助我理解所有重点之间的区别。 特别是,每个人到底意味着什么?

在没有获得锁的情况下测试锁?

我有物品,他们得到锁。 我想测试他们是否被锁定而没有获得锁定。 我的想法是,如果我TryEnter()然后我必须Exit()如果为true只检查锁正确。 看起来像一个非常基本的问题,它是如何完成的?