我有一个每5分钟运行一次的进程A,需要在表"EventLog"中写一些东西.这整天都在工作,但是在晚上还有另一个进程B开始需要从该表中删除大量旧数据.该表有数百万行(包括blob)和许多相关表(通过级联删除),因此进程B最多运行约45分钟.当进程B运行时,我得到了很多进程A的死锁警告,我想摆脱这些.
简单的选择是"当进程B运行时不要运行进程A"但必须有更好的方法.我在两个进程中都使用EntityFramework 6和TransactionScope.我没有找到如何在我的进程中设置优先级或类似的东西.这可能吗?
编辑: 我忘了说我已经在每条记录使用一个删除事务,而不是所有记录都使用一个事务.在内部循环中,我创建了新的DBContext和TransactionScope,因此每条记录都有自己的事务.我的问题是删除记录仍然需要一些时间,因为相关的BLOB和其他相关表中的数据(假设每行大约5秒).当删除进程(B)与插入进程(A)交叉时,我仍然遇到死锁情况.
我的C#Windows服务应用程序通过SMB,FTP或SSH整天通过网络复制大量文件.要做文件副本,我只需使用System.IO.File.Copy
..NET Framework在这里执行哪个命令?是复制吗?也许xcopy?这在不同的Windows版本上有所不同吗?我还读到了robocopy,但似乎没有API.是否值得使用P/Invoke与xcopy或robocopy而不是简单的副本?目前我对我的情况表示怀疑.
在将来的版本中,我必须将所有文件复制到两个远程目录而不是一个.那么当我通过复制文件时会发生什么
File.Copy("c:\ test.txt","\\ server1\dir1\test.txt")
然后打电话
File.Copy("\\ server1\dir1\test.txt","\\ server1\dir2\test.txt")
文件是否会从我的服务器复制两次到目标服务器?据我所知,我的电脑说将文件从A复制到B,所以文件将从A转移到我的机器到B,对吗?
我正在尝试异步运行一些东西.这是我的代码:
private async void SearchButton_Click(object sender, EventArgs e)
{
await Search();
}
// Inside search there is no async operation
public Task Search()
{
// search for data in DB
// update DataGridView and other elements on UI
// How to return null/void/nothing?
return ???;
}
Run Code Online (Sandbox Code Playgroud)
等待同步方法是非法/不良做法Search()
吗?我知道我可以使用Task.Run(Search)
而不是然后Search()
将在另一个线程(不是在UI线程)上执行,我必须经常Invoke()
在里面使用Search()
.
我将Search()
方法的返回值从'void'更改为'Task',所以它等待但是我必须返回什么?