我正在寻找一个更好的模式来处理每个需要处理的元素列表,然后根据结果从列表中删除.
你不能.Remove(element)在里面使用foreach (var element in X)(因为它导致Collection was modified; enumeration operation may not execute.异常)...你也不能使用for (int i = 0; i < elements.Count(); i++),.RemoveAt(i)因为它会扰乱你在集合中的当前位置i.
有一种优雅的方式来做到这一点?
我创建了一个应用程序,它使用settings.settings来存储一些用户特定的设置(scope = User).设置在启动时正确加载,在使用过程中更改并正确保存以供下次启动.这个循环似乎没有问题.
当我更新新版本的程序集和文件版本时,会出现问题.启动时不再加载设置(而是使用默认值).即使启动版本1.2并且生成并保存了新的配置文件(即,您可以重新启动版本1.1并且配置文件将是从该文件保存的配置文件),似乎从版本1.1保存的配置文件将保持不变.版).
因此,设置似乎特定于程序集和/或文件的版本.值得注意的是,在版本1.1和版本1.2之间没有对settings.settings文件或其他任何内容进行任何更改(即我在这些不同版本之间进行的唯一更改是修改版本号).
有没有办法在版本更改后保留这些设置?
我使用最新版本的官方Amazon S3 SDK(1.0.14.1)来创建备份工具.到目前为止,如果我上传的文件大小低于5 MB,一切正常,但当任何文件大于5 MB时,上传失败,并出现以下异常:
System.Net.WebException:请求已中止:请求已取消.---> System.IO.IOException:在写入所有字节之前无法关闭流.在System.Net.ConnectStream.CloseInternal(布尔内部调用,布尔中止)---内部异常堆栈跟踪结束---在Amazon.S3.AmazonS3Client.ProcessRequestError(字符串actionName,HttpWebRequest请求,WebException we,HttpWebResponse errorResponse,String requestAddr ,WebSeaderCollection&respHdrs,类型t)在Amazon.S3.AmazonS3Client.PutObject(PutObjectRequest请求)的Amazon.S3.AmazonS3Client.Invoke [T](S3Request userRequest)处于W的BackupToolkit.S3Module.UploadFile(String sourceFileName,String destinationFileName):\code\AutoBackupTool\BackupToolkit\S3Module.cs:BackupToolkit.S3Module的第88行.
注意:5 MB大致是失败的边界,它可以略低或更高
我假设连接超时,并在文件上载完成之前自动关闭流.
我试图找到一种设置长超时的方法(但我找不到其中的选项AmazonS3或AmazonS3Config).
关于如何增加超时的任何想法(如我可以使用的应用程序范围设置)还是与超时问题无关?
码:
var s3Client = AWSClientFactory.CreateAmazonS3Client(AwsAccessKey, AwsSecretKey);
var putObjectRequest = new PutObjectRequest {
BucketName = Bucket,
FilePath = sourceFileName,
Key = destinationFileName,
MD5Digest = md5Base64,
GenerateMD5Digest = true
};
using (var upload = s3Client.PutObject(putObjectRequest)) { }
Run Code Online (Sandbox Code Playgroud) 我正在为我创建的记录器类编写一些单元测试,我想模拟文件类.我找不到我需要用来创建MOQ的接口...那么如何在没有接口的情况下成功MOQ一个类?
我还不清楚如何在没有可用接口的情况下使用依赖注入:
private FileInfo _logFile;
public LogEventProcessorTextFile(FileInfo logFile) {
_logFile = logFile;
}
Run Code Online (Sandbox Code Playgroud)
当我真的想做这样的事情时(注意IFileInfo而不是FileInfo):
private IFileInfo _logFile;
public LogEventProcessorTextFile(IFileInfo logFile) {
_logFile = logFile;
}
Run Code Online (Sandbox Code Playgroud) 我正在学习WCF,LINQ和其他一些技术,从头开始编写自定义远程控制应用程序,如VNC.我在创建它时考虑到三个主要目标:
现在我正在使用WCF发送一个表示正在发送的窗口的字节数组:
using (var ms = new MemoryStream()) {
window.GetBitmap().Save(ms, ImageFormat.Jpeg);
frame.Snapshot = ms.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
GetBitmap实现:
var wRectangle = GetRectangle();
var image = new Bitmap(wRectangle.Width, wRectangle.Height);
var gfx = Graphics.FromImage(image);
gfx.CopyFromScreen(wRectangle.Left, wRectangle.Top, 0, 0, wRectangle.Size, CopyPixelOperation.SourceCopy);
return image;
Run Code Online (Sandbox Code Playgroud)
它然后通过WCF(TCPBinding,它将始终通过LAN)发送到客户端,并在没有边框的空白窗口形式重建,如下所示:
using (var ms = new MemoryStream(_currentFrame.Snapshot))
{
BackgroundImage = Image.FromStream(ms);
}
Run Code Online (Sandbox Code Playgroud)
我希望这个过程在CPU和内存使用方面尽可能高效,带宽排在第三位.我的目标是让客户端连接到5台服务器,每台服务器有10多个应用程序.
我现有的方法是最好的方法(同时继续使用这些技术)并且我能做些什么来改进它?
我正在研究的想法(但我没有经验):
Amazon .NET AWS SDK的AmazonS3线程是安全的还是我应该AmazonS3在多线程系统中为每个请求创建一个新实例?
专门针对最新的.NET AWS SDK(版本1.3.14).
如果已经被调用,ContinueWith(...)在a 上使用该方法是否安全? TaskCompletionSource.TaskTaskCompletionSource.SetResult(...)
这个基本代码有望帮助构建问题:
// this was written inside the question box, please excuse any silly errors and lack of error checking (I'm not near VS right now)...
private WebClient _webClient = new WebClient();
public Task<string> GetExamplePage() {
var tcs = new TaskCompletionSource<string>();
web.DownloadStringCompleted += (s, ea) => tcs.SetResult(ea.Result);
web.DownloadStringAsync(new URI(@"http://www.example.com/example.html"));
return tcs.task;
}
public void ProcessExamplePage() {
var task = GetExamplePage();
Thread.Sleep(1000);
task.ContinueWith(t => Console.WriteLine(t.Result)); // *line in question*
}
Run Code Online (Sandbox Code Playgroud)
Console.WriteLine(...)如果WebClient.DownloadStringCompleted事件在task.ContinueWith设置之前已经被触发,那么执行吗? …
我正在使用一个超过3年的SVN存储库,包含超过6,100个提交,大小超过1.5 GB.我想减少SVN存储库的大小(我不是在谈论完整SVN导出的大小 - 我的意思是服务器上存在的完整存储库),然后再将其移动到新服务器.
当前存储库包含所有软件项目的源代码,但它还包含相对较大的二进制文件,例如:
自添加以来,许多这些大型文件已被"SVN删除",这进一步造成了识别最大违法者的问题.
我想要:
这些都可能吗?
是否可以阻止多个订阅者订阅活动?
我已经创建了一个快速示例代码片段给我的问题一些上下文但不幸的是我现在无法测试它,因为我不在我的VS机器上.
目标是:
这可能吗?
public delegate List<IBaseWindow> GetWindowListDelegate();
public static event GetWindowListDelegate GetWindowListEvent;
public List<IBaseWindow> GetWindowList() {
if (GetWindowListEvent == null) {
return new List<IBaseWindow>();
}
return GetWindowListEvent();
}
Run Code Online (Sandbox Code Playgroud)
注意:我使用的是.NET 3.5 sp1.
我在过去的两天里一直在和WCF合作,而且我的开发机器上的服务器和客户端都很顺利.既然我正试图在网络上的另一台机器上与客户端进行一些分布式测试,我就开始遇到问题了.现在我得到的错误是:
由于EndpointDispatcher上的ContractFilter不匹配,因此无法在接收方处理带有Action'http://tempuri.org/IWindowUpdateContract/UpdateWindowFrames ' 的消息.这可能是由于合同不匹配(发送方与接收方之间的操作不匹配)或发送方与接收方之间的绑定/安全性不匹配.检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息,传输,无).
因为这已经是一个巨大的学习经验(我之前没有做任何远程处理,RPC等)我想继续开发学习工具并在我完成时重新访问安全性(我无意构建任何实际的东西)在没有适当的安全最佳实践的情况下使用).
笔记:
我的服务器是这样创建的:
var svh = new ServiceHost(_serviceImplementation);
var binding = new NetTcpBinding();
binding.ReaderQuotas.MaxArrayLength = 2000000;
binding.Security.Mode = SecurityMode.None;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
binding.Security.Transport.ProtectionLevel = ProtectionLevel.None;
binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
svh.AddServiceEndpoint(_serviceInterface, binding, string.Format("net.tcp://{0}:{1}", _endPoint.Address, _endPoint.Port));
_stopFlag = new AutoResetEvent(false);
svh.Open();
_stopFlag.WaitOne();
Run Code Online (Sandbox Code Playgroud)
我的客户端是这样创建的:
var binding = new NetTcpBinding();
binding.ReaderQuotas.MaxArrayLength = 2000000;
binding.Security.Mode = SecurityMode.None;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
binding.Security.Transport.ProtectionLevel = ProtectionLevel.None;
binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
var scf = new ChannelFactory<IUserInputContract>(binding, "net.tcp://192.168.0.42:8001");
_uiUpdateServer = scf.CreateChannel(); …Run Code Online (Sandbox Code Playgroud)