我有一些代码想要从Microsoft.Azure.ServiceBus迁移到Azure.Messaging.ServiceBus,考虑到前一个包已被视为已弃用。
我不知道如何使用这个新包的一件事是构建/操作连接字符串。具体来说,我使用ServiceBusConnectionStringBuilder从我的配置中解析连接字符串并获取EntityPath
,以及此类提供的一些其他内容。
我是否忽略了某些内容,或者此功能已被完全删除?
编辑:我甚至想提出这个问题暂时疯狂,但当时有意义(见下面的编辑2).
对于.NET 3.5项目,我有两种类型的资源(R1和R2),我需要检查它的可用性.每种资源类型可以随时(例如)有10个实例.
当其中一种资源可用时,我的工作线程需要唤醒(存在可变数量的线程).在早期的实现中,只有一种资源类型,我使用Semaphore来检查可用性.
现在我需要等待两个单独的信号量(S1和S2)来跟踪资源的可用性.
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
几乎没用.
我正在努力摆脱静态代码分析中的一些警告.在一个特定情况下,没有在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 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) 当我在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 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 编写的?
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时?评估所有属性的调试器让我感到害怕.
我试图设置所有窗口的透明度.我有以下代码.
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) 我有一个ASP.NET页面加载太长时间.一点点测试表明,服务器端日志记录占用了相当多的时间(并且因为用户永远不需要查看日志记录结果)我想延迟它直到页面加载完毕.
有一个简单的方法吗?
我已经尝试将它放在页面的Disposed
事件中,但这似乎并不会触发,Unload
但事件发生的时间太快了.我宁愿不必产生一个线程,但我可能能够做到这一点.
我不是在寻找AJAX.我想做一个正常的整页加载,然后在页面加载后(从客户端看)进行更多的处理.
.net ×7
c# ×7
asp.net ×1
azure ×1
boxing ×1
closures ×1
com ×1
dcom ×1
dispatch ×1
handle ×1
overloading ×1
polymorphism ×1
properties ×1
resharper ×1
tlbimp ×1
transparency ×1
waithandle ×1