我目前正在开发.NET 4.0,Visual Studio 2010,Windows 7-32bit的Windows服务.我有一个安装程序项目,为我安装.当我安装该服务,卸载它,并尝试再次安装时,我收到以下错误:
错误1001.指定的服务已标记为删除
在Windows XP中,问题是Services.msc已打开.关闭此窗口可以解决此问题.
但是,使用Windows 7,我可以解决此问题的唯一方法是重新启动.我尝试关闭所有程序,但问题仍然存在.
有没有人知道如何解决这个问题而不重新启动?
编辑
我没有看到这个问题,因为我停止使用MSI安装程序,而是使用sc.exe来手动安装服务.我认为这个问题可能与Visual Studio 2010和MSI安装程序项目的组合有关.但是,我仍然不知道这个问题的罪魁祸首是什么. 事实证明,Process Explorer是罪魁祸首.
是否可以在编译后在.NET DLL中添加/删除/更改嵌入式资源?如果是这样,这是怎么做的,有没有陷阱?
编辑:
我想手动执行此操作,但最终会自动通过构建后事件中的脚本执行此操作.
假设我有一个包含Description Description,varchar(100)列的表.如果尝试插入超过100个字符的字符串,插入将失败.
在插入列之前,Entity Framework中是否有一种方法可以自动截断或修剪字符串以适应列?在我的场景中,我真的不在乎字符串是否被截断,我只是想要插入而不是仅仅失败并记录rror.
由于该模型已经知道了长度限制,我认为Entity Framework可能有办法为我做这个.
如果不支持,最好的方法是什么?扩展自动生成的部分类并覆盖On*Changed方法?我宁愿不对长度限制进行硬编码,而是使用已在实体模型中定义的长度限制.我怎么能访问这个?
编辑
我的最终解决方案是实现自动生成实体的On*Changed部分方法.
我有一个应用程序,我想要多个线程来读取列表.我想定期用新数据更新列表.当列表更新时,我想我可以创建一个新列表并将其替换为旧列表.例:
private List<string> _list = new List<string>();
private void UpdateList()
{
var newList = new List<string>(QueryList(...));
_list = newList;
}
private void ThreadRun()
{
foreach (var item in _list)
{
// process item...
}
}
Run Code Online (Sandbox Code Playgroud)
在UpdateList方法中,创建一个新列表,并将_list引用与新列表交换.根据我的想法,任何现有的线程仍将保留对旧列表的引用(这对我来说没问题),任何新线程都将获取新列表.最终,所有线程都将结束,旧列表最终将被垃圾收集.这段代码中是否需要锁定,或者我需要注意什么才能确保安全的多线程访问?
有没有办法清除函数内部的返回值,所以我可以保证返回值是我想要的?或者可能关闭此功能的行为?
在这个例子中,我希望返回值是一个包含("Hello","World")的ArrayList
function GetArray()
{
# $AutoOutputCapture = "Off" ?
$myArray = New-Object System.Collections.ArrayList
$myArray.Add("Hello")
$myArray.Add("World")
# Clear return value before returning exactly what I want?
return $myArray
}
$x = GetArray
$x
Run Code Online (Sandbox Code Playgroud)
但是,输出包含Add操作中捕获的值.
0
1
Hello
World
Run Code Online (Sandbox Code Playgroud)
我发现Powershell的这个"特性"非常烦人,因为它只是通过调用另一个你不知道返回值的函数来打破你的函数非常容易.
更新
我知道有一些方法可以防止输出被捕获(如下面的答案中所述),但这需要您知道函数实际返回一个值.如果您正在调用另一个Powershell函数,将来有人会更改此函数以返回一个值,这将破坏您的代码.
我需要编写一个接收事件的组件(事件具有唯一的ID).每个活动都要求我发出请求.该事件指定一个超时期限,等待来自请求的响应.
如果响应在计时器触发之前响起,那很好,我取消了计时器.如果计时器首先触发,那么请求超时,我想继续前进.
此超时时间是在事件中指定的,因此它不是常量.预期的超时时间在30秒到5分钟的范围内.
我可以看到实现这个的两种方法.
选项1似乎是最简单的解决方案,但我担心创建这么多计时器可能不是一个好主意,因为计时器可能太昂贵了.在创建大量计时器时是否存在任何陷阱?我怀疑在后台,定时器实现可能实际上是选项2的有效实现.如果这个选项是个好主意,我应该使用哪个定时器?System.Timers.Timer或System.Threading.Timer.
选项2似乎更多的工作,与选项1相比可能不是一个有效的解决方案.
更新
我期望的最大定时器数量在10000的范围内,但更有可能在100的范围内.另外,正常情况是在发射之前取消定时器.
更新2
我使用10K实例运行测试,System.Threading.Timer并System.Timers.Timer密切关注线程数和内存.System.Threading.Timer与System.Timers.Timer通过内存使用判断相比,似乎"更轻" ,并且没有为两个定时器创建过多的线程(即 - 线程池正常工作).所以我决定继续使用System.Threading.Timer.
既然Microsoft已经在Windows Workflow Foundation 4中修改了他们的工作流框架,那么您对这个新框架的想法和经验是什么?
我已经和WF4合作了几个月了,我遇到了一些陷阱:
尽管存在缺陷,但我对数据库的持久性功能,设计器中易于捕获活动以及将WCF服务设置为工作流服务的难易程度印象深刻.
我很好奇使用Workflow Foundation 4的其他开发人员的经验.
编辑:
我能够解决大型工作流程设计极其缓慢的问题.事实证明,有无法解决的进口,这显然会给设计师带来很大的压力.
更新
现在我们正在生产中运行,AppFabric面临着一系列问题.我很清楚,截至目前,AppFabric Workflow Services还没有准备好使用.在新版本发布之前,我会远离这个.
我有一个WPF应用程序,我使用System.Threading.Tasks进行长时间运行的WCF调用.我通过向Application.Current.DispatcherUnhandledException添加处理程序来捕获未处理的异常.
我创建了一个任务,其中ContinueWith函数使用以下代码在UI线程上运行:
var task = new Task<T>(func).ContinueWith(t =>
{
if (t.IsFaulted)
{
throw t.Exception.GetBaseException();
}
else
{
// Show t.Result on UI
}
}, TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
当任务中发生异常时,我想重新抛出异常,以便DispatcherUnhandledException处理程序可以处理它.但是当我重新抛出异常时,如上所示,它会崩溃我的应用程序并且不会调用DispatcherUnhandledException.
如何在UI线程上重新抛出异常,以便调用DispatcherUnhandledException处理程序?
当我使用BackgroundWorker时,重新抛出异常就是这样.基本上,我希望用Task替换BackgroundWorker,因为Task有一些我想要利用的非常好的功能.
这是关于MSDN上描述的C#.NET中的异步模式的一般性问题.
当需要调用长时间运行的同步操作(例如--WCF,DB查询,IO等),并且我不希望线程阻塞(例如 - GUI线程)时,这是否意味着必须存在另一个线程哪个地方阻挡?
使异步同步调用必然需要一个线程来阻塞吗?
那么,如果我进行10次长时间运行的异步调用(实际上是10次同步调用),那么必须有10个线程在那里进行等待吗?或者是否有一种机制可以防止10个线程被阻塞?
在WCF中,您可以为WCF调用创建Begin和End方法,以使其异步.这是否意味着当我调用这个异步方法时,在客户端或服务器上的某个地方有一个线程可以等待我吗?
我已经阅读了几篇关于实现异步的不同方法的文章,但是这些文章没有解释在幕后做了什么.
更新
我提出了更具体的问题,因为我更关心.NET.MSDN描述的异步模式.
更新2
我将这个问题改为更具体,使同步调用异步.
我目前正在使用接口中定义的大量方法的WCF服务.这些方法中的大多数是简单的CRUD操作,使用实体框架有一些逻辑,并且可以很容易地分成功能区域.只有一个文件接近1K行代码,我想将其拆分以保持可维护性.我正在考虑以下事项:
此外,按功能区域划分,还是通过CRUD方法(组合在一起,共同创建等)会更好.
在处理WCF服务时,这必然是一个非常常见的问题.组织WCF服务方法的好方法是什么?
更新
最后,我决定将服务调用传递给内部静态类.