小编Joh*_*ers的帖子

阻止并等待事件

它有时希望在等待事件发生时阻塞我的线程.

我通常会这样做:

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)

.net c# events

35
推荐指数
1
解决办法
4万
查看次数

降低Task.Factory.StartNew线程的优先级

像下面这样的代码将启动一个新线程来完成这项工作.有什么方法可以控制该线程的优先级吗?

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)

.net c# multithreading .net-4.0 taskfactory

35
推荐指数
4
解决办法
4万
查看次数

如何在cmd中检索TIME的秒部分?

我正在尝试编写一个获取当前日期和时间的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,但它只给出了小时和分钟,我也需要秒.

cmd batch-file

35
推荐指数
3
解决办法
6万
查看次数

如何在临时表中保存选择查询结果?

我需要将select查询输出保存到临时表中.然后我需要对这个临时表进行另一个选择查询.有谁知道怎么做?

我需要在SQL Server上做这个.

sql-server sql-server-2005

35
推荐指数
2
解决办法
10万
查看次数

如何创建包含集合集的配置节?

我需要一个像这样的配置部分:

<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中使用它.

.net configuration system.configuration

35
推荐指数
1
解决办法
2万
查看次数

从WebRequest模拟WebResponse

我终于开始讨论创建一些与RESTful Web界面一起使用的应用程序,但是,我担心每次按F5运行一系列测试时我都在锤击他们的服务器.

基本上,我需要获得一系列的Web响应,以便我可以测试我正确解析变化的响应,而不是每次都打到它们的服务器,我想我可以这样做一次,保存XML然后在本地工作.

但是,我不知道如何"模拟"WebResponse,因为(AFAIK)它们只能由WebRequest.GetResponse实例化.

你们怎么去嘲笑这种事情?你呢?我真的不喜欢我正在锤击他们的服务器的事实:SI不想过多地改变代码,但我希望有一种优雅的方式来做这件事.

接受后更新

Will的回答是我所需要的一记耳光,我知道我错过了一个基本点!

  • 创建一个接口,该接口将返回代表XML的代理对象.
  • 实现接口两次,一次使用WebRequest,另一次返回静态"响应".
  • 接口实现然后基于响应或静态XML实例化返回类型.
  • 然后,您可以在测试或生产时将所需的类传递给服务层.

一旦我敲了代码,我就会粘贴一些样本.

xml rest web-services webrequest webresponse

34
推荐指数
2
解决办法
1万
查看次数

如何在"我的自定义工具"中写入Visual Studio输出窗口?

我正在编写一个自定义工具,我目前正在做我想要的功能.如果出现问题,我希望能够写入Visual Studio.(代码格式不正确或其他).

这有什么标准吗?现在我基本上可以强制该工具失败,Visual Studio会发出警告,表明它已经这样做了.我想在"输出"窗口中输入一个类别,其中包含我要发送的任何结果消息.我还可以在错误列表窗口中使用更具描述性的任务/警告.

vsx customtool visual-studio

34
推荐指数
2
解决办法
2万
查看次数

像phpMyAdmin但是对于SQL Server?

我正在寻找基于web的工具,如phpMyAdmin,但对于SQL Server.有什么建议?

sql-server phpmyadmin

34
推荐指数
2
解决办法
4万
查看次数

如何使用通配符搜索文件列表

如何在C#中使用通配符列出所选文件夹中包含的文件?

c# wildcard

34
推荐指数
3
解决办法
3万
查看次数

TCP打孔(NAT Traversal)库还是什么?

我想在C#中进行TCP打孔(NAT Traversal).如果需要,可以使用集合服务器完成.我找到了http://sharpstunt.codeplex.com/但无法让它工作.理想情况下,我需要一些方法,我将一个端口号(int)作为参数,在NAT上调用此方法后可用("Port Forwarded").如果该方法只返回一些后来在NAT上可用的端口号,那也没关系.有没有人用C#做过这个?你能给我一些sharpstunt或其他东西的例子吗?

c# tcp nat

34
推荐指数
2
解决办法
2万
查看次数