它有时希望在等待事件发生时阻塞我的线程.
我通常会这样做:
private AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
private void OnEvent(object sender, EventArgs e){
_autoResetEvent.Set();
}
// ...
button.Click += OnEvent;
try{
_autoResetEvent.WaitOne();
}
finally{
button.Click -= OnEvent;
}
Run Code Online (Sandbox Code Playgroud)
但是,似乎这应该是我可以提取到一个公共类(或者甚至可能已经存在于框架中的东西)的东西.
我希望能够做到这样的事情:
EventWaiter ew = new EventWaiter(button.Click);
ew.WaitOne();
EventWaiter ew2 = new EventWaiter(form.Closing);
ew2.WaitOne();
Run Code Online (Sandbox Code Playgroud)
但我真的找不到构建这样一个类的方法(我找不到一个好的方法来将事件作为参数传递).有人可以帮忙吗?
举一个为什么这个有用的例子,考虑这样的事情:
var status = ShowStatusForm();
status.ShowInsertUsbStick();
bool cancelled = WaitForUsbStickOrCancel();
if(!cancelled){
status.ShowWritingOnUsbStick();
WriteOnUsbStick();
status.AskUserToRemoveUsbStick();
WaitForUsbStickToBeRemoved();
status.ShowFinished();
}else{
status.ShowCancelled();
}
status.WaitUntilUserPressesDone();
Run Code Online (Sandbox Code Playgroud)
这比使用在许多方法之间展开的逻辑编写的等效代码更简洁和可读.但是要实现WaitForUsbStickOrCancel(),WaitForUsbStickToBeRemoved和WaitUntilUserPressesDone()(假设我们在插入或删除usb棒时得到一个事件)我需要每次都重新实现"EventWaiter".当然,你必须要小心,永远不要在GUI线程上运行它,但有时这对于更简单的代码来说是值得的权衡.
替代方案看起来像这样:
var status = ShowStatusForm();
status.ShowInsertUsbStick();
usbHandler.Inserted += OnInserted;
status.Cancel += OnCancel;
//...
void OnInserted(/*..*/){ …Run Code Online (Sandbox Code Playgroud) 像下面这样的代码将启动一个新线程来完成这项工作.有什么方法可以控制该线程的优先级吗?
Task.Factory.StartNew(() => {
// everything here will be executed in a new thread.
// I want to set the priority of this thread to BelowNormal
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个获取当前日期和时间的cmd脚本,并将其格式化为sqlserver可以将其作为输入的方式datetime.
到目前为止,我有:
@echo off
for /F "tokens=1-4 delims=/ " %%i in ('date /t') do (
set dow=%%i
set mon=%%j
set day=%%k
set yr=%%l
set mydate=%%j/%%k/%%l
)
Run Code Online (Sandbox Code Playgroud)
这打印出10/22/2010
我无法弄清楚如何将时间变成可用的格式.我尝试过time /t,但它只给出了小时和分钟,我也需要秒.
我需要将select查询输出保存到临时表中.然后我需要对这个临时表进行另一个选择查询.有谁知道怎么做?
我需要在SQL Server上做这个.
我需要一个像这样的配置部分:
<myConfig>
<mySubConfig1>
<mySubSubConfig1 keyAttribute="value1">
<mySubSubConfig1Element keyAttribute="value1"/>
<mySubSubConfig1Element keyAttribute="value2"/>
</mySubSubConfig1>
<mySubSubConfig1 keyAttribute="value2">
<mySubSubConfig1Element keyAttribute="value1"/>
</mySubSubConfig1>
</mySubConfig1>
<mySubConfig2>
<mySubSubConfig2 keyAttribute="value1">
<mySubSubConfig2Element keyAttribute="value1"/>
<mySubSubConfig2Element keyAttribute="value2"/>
</mySubSubConfig2>
<mySubSubConfig2 keyAttribute="value2">
<mySubSubConfig2Element keyAttribute="value1"/>
</mySubSubConfig2>
</mySubConfig2>
<mySubConfig3>
<mySubSubConfig3 keyAttribute="value1">
<mySubSubConfig3Element keyAttribute="value1"/>
<mySubSubConfig3Element keyAttribute="value2"/>
</mySubSubConfig3>
<mySubSubConfig3 keyAttribute="value2">
<mySubSubConfig3Element keyAttribute="value1"/>
</mySubSubConfig3>
</mySubConfig3>
</myConfig>
Run Code Online (Sandbox Code Playgroud)
我还没有找到允许使用旧IConfigurationSectionHandler界面的魔法.有谁知道怎么做?
如果myConfig和mySubConfign是ConfigurationSectionGroup或是,我可以ConfigurationSection.
此外,如果重要,将从web.config中使用它.
我终于开始讨论创建一些与RESTful Web界面一起使用的应用程序,但是,我担心每次按F5运行一系列测试时我都在锤击他们的服务器.
基本上,我需要获得一系列的Web响应,以便我可以测试我正确解析变化的响应,而不是每次都打到它们的服务器,我想我可以这样做一次,保存XML然后在本地工作.
但是,我不知道如何"模拟"WebResponse,因为(AFAIK)它们只能由WebRequest.GetResponse实例化.
你们怎么去嘲笑这种事情?你呢?我真的不喜欢我正在锤击他们的服务器的事实:SI不想过多地改变代码,但我希望有一种优雅的方式来做这件事.
Will的回答是我所需要的一记耳光,我知道我错过了一个基本点!
一旦我敲了代码,我就会粘贴一些样本.
我正在编写一个自定义工具,我目前正在做我想要的功能.如果出现问题,我希望能够写入Visual Studio.(代码格式不正确或其他).
这有什么标准吗?现在我基本上可以强制该工具失败,Visual Studio会发出警告,表明它已经这样做了.我想在"输出"窗口中输入一个类别,其中包含我要发送的任何结果消息.我还可以在错误列表窗口中使用更具描述性的任务/警告.
我正在寻找基于web的工具,如phpMyAdmin,但对于SQL Server.有什么建议?
我想在C#中进行TCP打孔(NAT Traversal).如果需要,可以使用集合服务器完成.我找到了http://sharpstunt.codeplex.com/但无法让它工作.理想情况下,我需要一些方法,我将一个端口号(int)作为参数,在NAT上调用此方法后可用("Port Forwarded").如果该方法只返回一些后来在NAT上可用的端口号,那也没关系.有没有人用C#做过这个?你能给我一些sharpstunt或其他东西的例子吗?
c# ×4
.net ×3
sql-server ×2
.net-4.0 ×1
batch-file ×1
cmd ×1
customtool ×1
events ×1
nat ×1
phpmyadmin ×1
rest ×1
taskfactory ×1
tcp ×1
vsx ×1
web-services ×1
webrequest ×1
webresponse ×1
wildcard ×1
xml ×1