我刚刚编写了一个由多个线程同时调用的方法,我需要跟踪所有线程何时完成.代码使用此模式:
private void RunReport()
{
_reportsRunning++;
try
{
//code to run the report
}
finally
{
_reportsRunning--;
}
}
Run Code Online (Sandbox Code Playgroud)
这是代码中唯一_reportsRunning值被更改的地方,该方法需要大约一秒钟才能运行.
偶尔当我有超过六个左右的线程一起运行报告时,_reportsRunning的最终结果可以降到-1.如果我换到电话_runningReports++和_runningReports--一个锁,则行为似乎是正确的,一贯的.
所以,问题是:当我在C++中学习多线程时,我被教导你不需要同步调用递增和递减操作,因为它们总是一个汇编指令,因此线程不可能在中间切换-呼叫.我是否正确地教过,如果是这样的话,那对C#来说怎么回事?
这篇知识库文章说,ASP.NET Response.End()中止了一个帖子.
反射器显示它看起来像这样:
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很苛刻.正如知识库文章所说,以下应用程序中的任何代码Response.End()都不会被执行,这违反了最不惊讶的原则.它几乎就像Application.Exit()在WinForms应用程序中.造成线程终止异常Response.End()不开捕,所以代码周围的try...... finally不会满足.
这让我想知道我是否应该总是避免Response.End().
任何人都可以建议,我什么时候应该使用Response.End(),何时Response.Close()何地HttpContext.Current.ApplicationInstance.CompleteRequest()?
参考:Rick Strahl的博客文章.
根据我收到的输入,我的回答是,是的,Response.End是有害的,但在某些有限的情况下它是有用的.
Response.End()作为一个不可捕获抛出,立即终止HttpResponse在特殊的条件.在调试过程中也很有用. 避免Response.End()完成常规反应.Response.Close()立即关闭与客户端的连接.根据此MSDN博客文章,此方法不适用于正常的HTTP请求处理. 你不太可能有充分的理由来调用这种方法.我在WinForm上有几个TextBox.当按下Enter键时,我希望焦点移动到下一个控件?每当文本框获得控制权时,它也会选择文本,以便任何编辑都将替换当前文本.
做这个的最好方式是什么?
在这样的图书馆加载我是全新的,但这就是我的立场:
我有一个自制的DLL文件,它就像它获得的一样简单,类本身和方法.在加载此库的主程序中,我有:
Assembly testDLL = Assembly.LoadFile("C:\\dll\\test.dll");
Run Code Online (Sandbox Code Playgroud)
从这里开始,我有点卡住了.据我所知,它正确加载它,因为它在我更改名称时给出了错误.
我该怎么办?我究竟如何加载其中的类和方法?
谢谢.
我需要启动一个外部进程,该进程通过stdin和stdout来回发送的消息进行控制.使用subprocess.Popen我能够启动进程但是无法根据需要通过stdin控制执行.
我想要完成的是:
到目前为止,我已经提出了以下建议:
process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE);
for i in xrange(StepsToComplete):
print "Forcing step # %s"%i
process.communicate(input='\n')
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,'\n'不会传递给外部进程,我永远不会超越第0步.代码在process.communicate()处阻塞,不再继续.我错误地使用communic()方法?
另外,我将如何实现"等待外部进程写入新行"功能?
我在Twitter周围建立了一个GIS应用程序,现在它引起了一些兴趣.但其中一个要求是他们不需要任何外部依赖.所以我需要模仿Twitters的功能.
有人知道任何开源Twitter项目吗?
我目前正在研究一种可以进行网站集管理的TimerJob.当作业运行时,它会查找列表以检索网站集的Url,然后调用SPSite.Exists()以检查该网站是否仍然存在.
为了测试TimerJob,我删除了一个网站集,但是在列表中留下了相应的条目.然后我启动TimerJob并在调试模式中逐步执行其代码.当涉及到检查站点是否存在的点SPSite.Exists()返回true.
当我第二次为同一网站集运行TimerJob时,该SPSite.Exists()方法返回false.
所以现在我想知道为什么SPSite.Exists()当我第一次运行这个工作时返回错误的结果.这可能是由缓存引起的吗?
当我在TimerJob之外运行相同的代码时,每次都SPSite.Exists()返回正确的结果.
UPDATE
所以我做了一些调试,看起来这个问题确实是由一些缓存机制造成的,因为在删除测试网站集之后和TimerJob启动之前重新启动Windows SharePoint Services定时服务时不会发生这种情况.
目前我无法想象另一种解决方案,而不是尝试访问已删除的网站并捕获将被抛出的异常,以确定该网站是否真的存在.
更新2
经过一些测试后,我意识到重新启动定时器服务后第一次调用SPSite.Exists()(在TimerJob中)时不会出现问题.第二次调用(针对不同的网站集)仍会导致已知问题.
更新3
目前我正在使用一个丑陋的黑客来解决我的问题.当SPSite.Exists()返回true但它实际上不存在时,我创建一个SPSite对象并尝试通过调用其Usage属性来激发FileNotFoundException.当异常出现时,我知道该网站不存在.抛出异常后奇怪的是,SPSite.Exists()返回正确的结果(false).
还有其他建议吗?
再见,弗洛
有没有办法获取PHP函数的可用参数?
示例:我想打电话function1($arg1, $arg2=null).在调用函数之前,如何找出此函数所使用的参数数量,如果可能的话,我可以找出哪些参数?
如您所见,我正在动态调用函数.
开始学习一些shell脚本.我有一个在一个文件上运行的perl脚本.我如何编写一个shell脚本,在所有带有关键字"filename"的文件上多次运行perl脚本?
所以在英语中,
for /filename/ in filenames
perl myscript.pl completefilename
Run Code Online (Sandbox Code Playgroud)
谢谢.
我想在业余时间建立一个小型GIS,并一直在挖掘Geodjango.
我一直试图找到开源Geodjango项目的例子,但我运气不好,所以我在这里.我已经浏览了大部分可以找到的教程,但它们似乎都停留在同一点上,我很想看一些更复杂的现实代码.
有人知道我能在哪里找到一些吗?任何东西都足够了,但使用Google Earth API而不是Open Layers的东西是理想的.
c# ×4
.net ×1
asp.net ×1
c++ ×1
dll ×1
geodjango ×1
gis ×1
locking ×1
open-source ×1
php ×1
python ×1
sharepoint ×1
shell ×1
subprocess ×1
timer-jobs ×1
twitter ×1
unix ×1
winforms ×1