我有针对4.5构建的.net应用程序(GUI和PowerShell).我的操作系统是服务器2012.当我将我的应用程序附加到2013 Visual Studio时,调试器有时无法运行.它没有评估表达式或显示本地(并且还观察窗口/即时窗口没有任何作用 - 就好像项目是使用发布构建的).但我使用'Debug'配置构建.如上所述,当我简单地附加VS 2012时,同样的事情是有效的(是的,我有2k13和2k12 SXS)
请注意,如果我使用相同的设置(托管调试)附加相同的进程,则它始终有效.
我确保加载了符号(通过检查visual studio + debug + windows中的模块选项卡),点击了断点.
关于可能出现什么问题的任何想法?所有更新都是最新的.
当我使用VS 2k13 IDE进行开发时,它对于启动vs 2012只是为了调试而烦人.
问候!
我是WCF的新手.最初,我创建了一个WCF服务,并使用生成的客户端代理来使用来自客户端的服务.因此,每当我在服务上执行某些操作时,所有按顺序执行的操作都会同步调用操作.我将并发模式更改为多个,但操作仍然是同步进行的.然后我为我的操作生成了异步方法,并使用了开始/结束模式,因此我猜测它"释放"了通道并让操作并行/异步地增加了我的应用程序的吞吐量.
然后我用来ChannelFactory创建一个通道并执行操作,因为客户端和服务器可以共享合同(同一个项目).但IClientChannel只提供BeginOpen/EndOpen/BeignClose/EndClose.它不具备ClientBase的BeginOperation/EndOperation方法.所以基本上我不能在通道上异步执行操作来释放,以便我可以使用该通道执行其他操作.
我只是为每个操作创建了通道,它解决了这个问题
所以我的问题是:
哪个更好(ClientBase vs. ChannelFactory)wrt到我的场景特别是我想同时用多个线程对服务对象执行多个操作
是否建议为每个操作创建一个通道?
事实上,我认为我们在两个端点(客户端/服务)之间只能有一个通道.但我可以创建尽可能多的频道.例如:我能够创建通道的Int16.MaxValue.所以不确定这个限制和建议是什么.
Service[] channels = new IService[Int16.MaxValue];
for(int i = 0; i<Int16.MaxValue; i++)
{
channels[i] = factory.CreateChannel();
}
Run Code Online (Sandbox Code Playgroud)所以基本上你能告诉我有关频道,推荐和技巧的基础知识......等等.:)
为什么我们需要的参数配置在下面的代码片段.
此外,我们在终结器中使用false来调用dispose,它不会释放或进行清理.
那么如果处置永远不会被召唤怎么办?
在终结器之前总是被调用吗?
using System;
public class MyClass : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
**//Do we really need this condition?
if (disposing)**
{
// called via myClass.Dispose().
// OK to use any private object references
}
disposed = true;
}
}
public void Dispose()
// Implement IDisposable
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MyClass() // the finalizer
{
//why do we need to call with false?
Dispose(false);
} …Run Code Online (Sandbox Code Playgroud) 我有一个静态类,它有一些静态数据.如果数据从不同的应用域访问,会发生什么?
每个域都会有一个静态类的副本吗?
原始类型会被复制吗?
如果数据可序列化怎么办?
如何找到当前线程的最大堆栈大小?
我在从MMC UI执行函数时遇到堆栈溢出异常,但没有从Powershell(命令行/控制台)执行.所以我有点猜测它与UI线程中分配的默认堆栈大小有关,而不是Powershell(命令行/控制台).
那么如何找到当前线程的最大堆栈大小?
我知道理想情况下,不需要知道这些或设置这些,但看起来它与堆栈大小有关,因为它从console/powershell(命令行应用程序)而不是UI.
注释(下面的线程有点相关.但它没有回答我的问题.可能会给出一些指导)
要获得有关实际问题的更多信息:
为什么当客户端连接到'localhost'上的服务时,System.Net.ServicePoint.ConnectionLimit使用'7FFFFFFF'(Int32.MaxValue/2147483647),而如果服务在远程计算机上运行,它决定使用'2'作为默认值?
最初我认为如果没有设置servicepoint.connectionlimit,它将是ServicePointManager.DefaultConnectionLimit.但是,我刚刚意识到(一旦我从客户那里得到了一个问题),那就是它的Int32.MaxValue/2147483647.
我做了一些研究(详情请参考下面的链接),但是我无法找到它用于int32.maxvalue的原因.我可以猜测它可能是为了更好的性能,因为输入请求和响应消息不会越过边界.
我的问题:
一些与此相关的有用链接:
在httpwebrequest中创建TCP连接的方式和位置,以及它与servicepoint的关系如何?
http://blogs.microsoft.co.il/idof/2011/06/20/servicepointmanagerdefaultconnectionlimit-2-depends/
http://msdn.microsoft.com/en-us/library/system.net.servicepoint.connectionlimit(v=vs.110).aspx
http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html
Reflector的代码片段
public int ConnectionLimit
{
get
{
if ((!this.m_UserChangedLimit && (this.m_IPAddressInfoList == null)) && (this.m_HostLoopbackGuess == TriState.Unspecified))
{
lock (this)
{
if ((!this.m_UserChangedLimit && (this.m_IPAddressInfoList == null)) && (this.m_HostLoopbackGuess == TriState.Unspecified))
{
IPAddress address = null;
if (IPAddress.TryParse(this.m_Host, out address))
{
this.m_HostLoopbackGuess = IsAddressListLoopback(new IPAddress[] { address }) ? TriState.True : TriState.False;
} …Run Code Online (Sandbox Code Playgroud) 环境: Windows Server 2012,.net 4.5,visual studio 2013,
注意:不是UI应用程序(因此与着名的async/await/synchronizationcontext问题无关)(参考:http://channel9.msdn.com/Series/Three-Essential-Tips-for-Async/Async-library-methods-should -consider-using-Task-ConfigureAwait-false-)
编辑
其实我的不好 - 这是TYPO导致了交易.我粘贴了下面的样本片段(伪),导致死锁.基本上,我没有基于'childtasks'进行组合,而是在'外部任务'上做了:(.看起来我不应该在看电视时写'异步'代码:).
我已经离开原始代码片段,因为它确实回答了我的第一个问题(与我之前的两个代码片段中的async/await和unwrap的区别).死锁让我分心看到实际的问题:).谢谢大家的评论.
static void Main(string[] args)
{
Task t = IndefinitelyBlockingTask();
t.Wait();
}
static Task IndefinitelyBlockingTask()
{
List<Task> tasks = new List<Task>();
Task task = FooAsync();
tasks.Add(task);
Task<Task> continuationTask = task.ContinueWith(t =>
{
Task.Delay(10000);
List<Task> childtasks = new List<Task>();
////get child tasks
//now INSTEAD OF ADDING CHILD TASKS, i added outer method TASKS. Typo :(:)!
Task wa = Task.WhenAll(tasks/*TYPO*/);
return wa;
}, …Run Code Online (Sandbox Code Playgroud) 我相信如果我重写Equals,我还需要覆盖GetHashCode,以确保Dictionary等..数据结构按预期工作.
但是,如果我只想重写ToString,我还是必须重写Equals和GetHashCode方法.
我对powershell编程很新.我正在创建远程会话以编程方式执行某些命令.然而,它消耗了如此多的内存(大约150到200 MB).和更多的会话,更多的内存.
你能帮我解决一下这个问题吗?
观察:1.执行CreateRunSpace命令后,其消耗约3MB.
有人在创建运行空间时面临同样的问题:
"可能的PowerShell Runspace处理泄漏"
删除pssession使得运行空间释放句柄并修复了内存泄漏.它现在在~30到40MB之间切换.
谢谢!
(仅供参考 - 引用System.Management.Automation.dll)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation.Runspaces;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int success = 0;
int fails = 0;
for (int i = 0; i < 50; i++)
{
Runspace rs = RunspaceFactory.CreateRunspace();
//After this the memory will be incremented by ~3Mb in taskmanager
rs.Open();
using (Pipeline pl = rs.CreatePipeline())
{
Command cmd = …Run Code Online (Sandbox Code Playgroud) 框架:.net 4.5
我使用下面的示例代码模式以线程安全的方式初始化变量.最近我一直在阅读一些文章,这些文章解释了"在某些平台上已经破坏了双重检查锁定http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html "但看起来对我来说没问题.我正在使用.net 4.5.
根据评论提出建议
建议使用lazy并让.net框架在处理基于平台的线程安全和内存模型上做大量工作:):http://msdn.microsoft.com/en-us/library/dd642331.aspx
更新
似乎Eric Lippert一直建议不要使用这种模式(现在很困惑:() 这种模式的名称?(答案:使用双重检查锁定进行延迟初始化) C#手动锁定/解锁
更新2
下面的摘录是"像所有删除读锁的技术一样,图7中的代码(类似于我的代码)依赖于强写入顺序.例如,这个代码在ECMA内存模型中是不正确的,除非myValue变得易失,因为初始化LazyInitClass实例的写入可能会延迟到写入myValue之后,允许GetValue的客户端读取未初始化的状态.在.NET Framework 2.0模型中,代码在没有volatile声明的情况下工作.来自http://msdn.microsoft.com/en-us/magazine/cc163715.aspx
而且我也没有使用'volatile',因为许多示例都显示在不同的代码片段中.我也假设它也可以(参考:.NET中双重检查锁定需要volatile修饰符)
****psudeo代码 - 它解释了我正在使用的版本 - 构建于.net 4.5****之上
static private object s_syncObject = new object();
private static string s_lazyInitializedVariable = null;
//is it necessar to make the backing varible volatie?
//private static volatile string s_lazyInitializedVariable = null;
private static string LazyInitializedVariable
{
get
{
if(string.IsNullOrWhiteSpace(s_lazyInitializedVariable))
{
lock(s_syncObject)
{
if (string.IsNullOrWhiteSpace(s_lazyInitializedVariable))
{
/*
* my …Run Code Online (Sandbox Code Playgroud) .net ×9
c# ×8
c#-3.0 ×3
powershell ×2
appdomain ×1
asp.net ×1
async-await ×1
servicepoint ×1
wcf ×1
wcf-client ×1