小编Tho*_*rin的帖子

Azure.Messaging.ServiceBus 中的 ServiceBusConnectionStringBuilder 的等效项

我有一些代码想要从Microsoft.Azure.ServiceBus迁移到Azure.Messaging.ServiceBus,考虑到前一个包已被视为已弃用。

我不知道如何使用这个新包的一件事是构建/操作连接字符串。具体来说,我使用ServiceBusConnectionStringBuilder从我的配置中解析连接字符串并获取EntityPath,以及此类提供的一些其他内容。

我是否忽略了某些内容,或者此功能已被完全删除?

.net azure azureservicebus

7
推荐指数
2
解决办法
1456
查看次数

WaitHandle.WaitAny和Semaphore类

编辑:我甚至想提出这个问题暂时疯狂,但当时有意义(见下面的编辑2).

对于.NET 3.5项目,我有两种类型的资源(R1R2),我需要检查它的可用性.每种资源类型可以随时(例如)有10个实例.

当其中一种资源可用时,我的工作线程需要唤醒(存在可变数量的线程).在早期的实现中,只有一种资源类型,我使用Semaphore来检查可用性.

现在我需要等待两个单独的信号量(S1S2)来跟踪资源的可用性.

WaitHandle[] waitHandles = new WaitHandle[] { s1, s2 };
int signalledHandle = WaitHandle.WaitAny(waitHandles);

switch (signalledHandle)
{
    case 0:
        // Do stuff
        s1.Release();
    case 1:
        // Do stuff
        s2.Release();
}
Run Code Online (Sandbox Code Playgroud)

然而,这有一个问题.从MSDN文档WaitAny:

如果在调用期间发出多个对象的信号,则返回值是具有所有信号通知对象的索引值最小的信号通知对象的数组索引.

这表明我可能会在打电话后将我的信号量计数减少1 WaitAny.因为signalledHandle将指示s1已发出信号,我将开始使用资源R1,并在完成后释放它.但是,由于我不知道S2是否已发出信号,因此此资源的可用性计数现在可能已关闭.如果发生这种情况10次,我的信号量将永久"空",资源R2将不再使用.

处理这个问题的最佳方法是什么?我是否应该从使用两个信号量切换到简单计数器,并在任何一个计数器更改时发出AutoResetEvent信号?我错过了一些更优雅的方法吗?

编辑1:
根据Ravadre的说法,之后只有一个信号量会被改变WaitAny.略微修改他的例子似乎证实了这一点,但有没有人可以指出我指出这个的一些官方文件?

编辑2:
我在回家的路上想着这个.只有这样,我才意识到,WaitAny任何用途都必须如此.这个问题不仅限于信号量,而是几乎任何类型的同步对象,WaitAny几乎没用.

.net c# multithreading waithandle

6
推荐指数
1
解决办法
6968
查看次数

这个Resharper修复处理关闭警告是否有意义?

我正在努力摆脱静态代码分析中的一些警告.在一个特定情况下,没有在a上进行处理ManualResetEvent.

有问题的代码在Func主线程上执行a 并阻塞调用线程一定的毫秒数.我意识到这听起来像一个奇怪的事情,但它超出了这个问题的范围,所以请耐心等待.

假设我添加如下using语句:

object result = null;
using (var completedEvent = new ManualResetEvent(false))
{
    _dispatcher.BeginInvoke((Action)(() =>
        {
            result = someFunc;
            completedEvent.Set();  // Here be dragons!
        }));

    completedEvent.WaitOne(timeoutMilliseconds);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

现在,我意识到这可能会导致问题.我也碰巧使用Resharper并且它通过"访问处理关闭"的消息警告我.

Resharper建议通过将违规行更改为:

if (completedEvent != null)
{ 
    completedEvent.Set();
}
Run Code Online (Sandbox Code Playgroud)

现在,提出的解决方案让我困惑.在正常情况下,没有理由null通过using语句设置变量..NET中的闭包是否有一些实现细节可以保证变量null在被关闭的变量被释放之后?

作为一个奖金问题,处理问题的解决方案是ManualResetEvent什么?

.net c# resharper closures

6
推荐指数
1
解决办法
3430
查看次数

方法重载和多态

我正在编写一个.NET Web应用程序,管理员可以在其中自定义呈现给用户的各种数据输入表单.管理员可以创建和自定义大约六种不同的字段类型(即文本,数字,下拉列表,文件上载).所有字段共享一组基本属性/行为(是否需要该字段?它是否具有默认字段值?).还有一系列字段特定的属性/行为(即下拉列表具有数据源属性,但文本字段不具有).为简单起见,我将遗漏问题域的许多其他特征.

类层次结构很简单:一个抽象的超类,它封装了常见的行为/属性,以及大约六个处理字段特定内容的具体子类.

每个字段类型都呈现(即映射到)作为特定类型的.NET服务器控件,所有这些都派生自System.Web.UI.Control.

我创建了以下代码来映射字段域对象及其相应的UI控件之间的值:

public static void Bind(Control control, IList<DocumentFieldBase> fieldBaseList)

     foreach (DocumentFieldBase fieldBase in fields){

            if (typeof (DocumentFieldText).IsInstanceOfType(fieldBase)){
                TextBox textbox = (TextBox) control;
                textbox.Text = (fieldBase as DocumentFieldText).GetValue();
            }

            if (typeof (DocumentFieldDropDown).IsInstanceOfType(fieldBase)){
                DropDown dropDown= (DropDown) control;
                dropDown.Text = (fieldBase as DocumentFieldSelectOne).GetValue().Text;
                dropDown.DataSource= (fieldBase as  DocumentFieldSelectOne).DataSource;
                dropDown.Id= (fieldBase as DocumentFieldSelectOne).GetValue().Id;
            }

            //more if statements left out for brevity
      }
}
Run Code Online (Sandbox Code Playgroud)

如果执行类型检查的语句,我想抛弃那些不敬虔的人.我正在拍摄的方法是使用子类输入为每个字段/控件组合创建一个方法重载.例如:

public static void Bind(TextBox control, DocumentFieldText fieldText){
 //some implementation code
}
public static void Bind(DropDown control, DocumentFieldDropDown fieldDropDown){ …
Run Code Online (Sandbox Code Playgroud)

.net c# polymorphism overloading dispatch

5
推荐指数
2
解决办法
3059
查看次数

.NET代码契约:它能比这更基本吗?

当我在Visual Studio(2008)内部注意到静态验证警告时,我只是在Stack Overflow上回答某人的问题:

string[] source = { "1", "A", "B" };
var sourceObjects = Array.ConvertAll(source, c => new Source(c)).ToArray();
Run Code Online (Sandbox Code Playgroud)

我收到消息需要未经证实的来源!= null.我觉得很明显,事实并非如此.这只是一个例子.另一方面,一些相当漂亮的东西似乎运作得相当好.

我正在使用1.2.20518.12版本(5月18日).我发现代码合同非常有趣,但有没有其他人有这样的案例?您是否认为当前的实现在实践中可用,或者您认为它们在这一点上纯粹是学术性的?

我把它做成了一个社区维基,但我想听听一些意见:)

.net c# code-contracts microsoft-contracts

5
推荐指数
1
解决办法
1075
查看次数

5
推荐指数
3
解决办法
1510
查看次数

DCOM 服务器和客户端均用 .NET 编写

我正在.NET 4(VS2010,C#)中开发DCOM服务器。就其本身而言,这工作得很好。

现在,我还需要为此 DCOM 服务器开发一个 .NET 客户端,但我无法添加对 TypeLib 的引用。Visual Studio 会告诉我类型库是从 .NET 程序集导出的,无法添加为引用。

这个问题的答案表明我应该能够用来TlbImp.exe生成包装器程序集,但它也会拒绝这样做:

TlbImp:错误 TI1029:类型库“MyWrapper”是从 CLR 程序集导出的,无法作为 CLR 程序集重新导入。

我知道,从纯粹的 .NET 角度来看,为此使用 DCOM 可能没有多大意义。但是,同一服务器也应该可以从非 .NET 应用程序访问。

我尝试过将 tlb 转换为 IDL 并从中重新生成 tlb,但这并不能欺骗 Visual Studio。

也许可以在重新生成之前稍微修改 IDL,或者是否有某种方法强制使用 DCOM,即使服务器和客户端都是用 .NET 编写的?

.net com dcom tlbimp

5
推荐指数
1
解决办法
3028
查看次数

C#属性的评估时间

class Bar
{
  private byte[] dg;

  Bar(byte[] datagram)
  {
    dg = datagram;
  }

  int Foo
  {
    get { return BitConverter.ToInt16(dg, 8); }
  }
}
Run Code Online (Sandbox Code Playgroud)

什么时候评估属性?在访问Foo时?评估所有属性的调试器让我感到害怕.

c# properties

3
推荐指数
1
解决办法
592
查看次数

我不能通过c#中的句柄设置窗口的透明度?

我试图设置所有窗口的透明度.我有以下代码.

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

    [DllImport("user32.dll")]
    static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    [DllImport("user32.dll")]
    static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);

    public const int GWL_EXSTYLE = -20;
    public const int WS_EX_LAYERED = 0x80000;
    public const int LWA_ALPHA = 0x2;

    public Form1()
    {
        InitializeComponent();
        this.Load += new EventHandler(Form1_Load);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Process[] processlist = Process.GetProcesses();

        foreach (Process theprocess in …
Run Code Online (Sandbox Code Playgroud)

c# transparency handle

3
推荐指数
1
解决办法
1744
查看次数

页面加载完成后,ASP.NET页面可以进行一些处理吗?

我有一个ASP.NET页面加载太长时间.一点点测试表明,服务器端日志记录占用了相当多的时间(并且因为用户永远不需要查看日志记录结果)我想延迟它直到页面加载完毕.

有一个简单的方法吗?

我已经尝试将它放在页面的Disposed事件中,但这似乎并不会触发,Unload但事件发生的时间太快了.我宁愿不必产生一个线程,但我可能能够做到这一点.

不是在寻找AJAX.我想做一个正常的整页加载,然后在页面加载后(从客户端看)进行更多的处理.

asp.net background-process

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