Tag: .net 4.5

TcpListener:如何在等待AcceptTcpClientAsync()时停止侦听?

我不知道如何在异步方法等待传入连接时正确关闭TcpListener。 我在SO上找到了这个代码,这里是代码: public class Server { private TcpListener _Server; private bool _Active; public Server() { _Server = new TcpListener(IPAddress.Any, 5555); } public async void StartListening() { _Active = true; _Server.Start(); await AcceptConnections(); } public void StopListening() { _Active = false; _Server.Stop(); } private async Task AcceptConnections() { while (_Active) { var client = await _Server.AcceptTcpClientAsync(); […]

当从finallys抛出exception时,不会评估Catch块

出现这个问题是因为以前在.NET 4.0中运行的代码在.NET 4.5中出现了未处理的exception,部分原因是try / finallys。 如果您需要详细信息,请阅读Microsoft connect 。 我用它作为这个例子的基础,所以它可能有助于引用。 代码 对于那些选择不阅读这个问题背后细节的人来说,这里可以快速了解发生这种情况的条件: using(var ms = new MemoryStream(encryptedData)) using(var cryptoStream = new CryptoStream(encryptedData, decryptor, CryptoStreamMode.Read)) using(var sr = new StreamReader(cryptoStream)) 这个问题是从CryptoStream的Dispose方法抛出exception(因为它们在using语句中,这些exception碰巧是从两个不同的finally块抛出的)。 当StreamReader调用cryptoStream.Dispose() ,将抛出CryptographicException 。 第二次cryptoStream.Dispose() ,在其using语句中,它抛出一个ArgumentNullException 下面的代码从上面提供的链接中删除了大部分不必要的代码,并将using语句展开到try / finallys中,以清楚地表明它们正在抛出finally块。 using System; using System.Security.Cryptography; namespace Sandbox { public class Program { public static void Main(string[] args) { try […]

.NET 4相当于Task.WhenAll()

在.NET 4中,是否有任何function等同于.NET 4.5的System.Threading.Tasks.Task.WhenAll() ? 目标是将多个异步任务包装成一个在完成所有组成任务时完成的任务。

使用应用程序设置中的值存储字符串数组

我修改了我的Settings.settings文件,以使system_Filters成为System.String[] 。 我想在Visual Studio设计器中填充此变量,而不是在代码中填充。 我可以使用以下代码在代码中使用它: Properties.Settings.Default.system_Filters = new string[] { “a”, “b”, “c” }; string _systemFilters = Properties.Settings.Default.system_Filters; 这工作正常。 但是,我没有一个好的地方把它放在我的代码中,理想情况下想在Settings.setting文件中输入它。 此值不会被修改。 我已经尝试了几乎所有我能想到的变体,但结果总是一样的。 有谁知道正确的语法? 如果这更容易,我也愿意使用StringCollection 。

List 。在.NET 4.5中的行为从.NET 4.0改变了吗?

我在针对.NET 4.0的项目中进行了以下测试: [TestFixture] public class Donkey { [Test] public void TestListSorting() { var expected = new[] { MockRepository.GenerateStub(), MockRepository.GenerateStub() }; var sorted = new List(expected); CollectionAssert.AreEqual(expected, sorted); sorted.Sort(); CollectionAssert.AreEqual(expected, sorted); } } 如果我在仅安装了.NET 4.0的计算机上运行它,则会失败。 如果我在安装了.NET 4.5的机器上运行它,它会通过。 我假设在.NET 4.5中, Sort的实现已经改变,以便在排序每个从CompareTo返回0的对象列表时保持顺序。 现在,抛开这个测试的明显疯狂。 我知道依靠这种行为是很疯狂的。 当然这是一个突破性的变化? 本页未列出.NET 4.0和4.5之间的兼容性。 是否有一个原因? 我错过了什么吗? 是否有另一页显示实际的重大变化? 我应该坐下来停止恐慌吗?

动态操作员解析

我有一个generics方法,通过将其中一个操作数转换为dynamic来调用运算符。 有两种不同的电话: //array is T[][] //T is MyClass array[row][column] != default(T) as dynamic 这工作并调用static bool operator !=(MyClass a, MyClass b) (即使双方都为null )。 让我感到惊讶的是以下行的行为: //array, a and b are T[][] //T is MyClass array[row][column] += a[line][i] * (b[i][column] as dynamic); 这叫 public static MyClass operator *(MyClass a, object b)和 public static MyClass operator +(MyClass a, object […]

如何正确使用Task.WhenAll()

我正在尝试使用Task.WhenAll等待完成多个任务。 我的代码如下 – 它应该启动多个异步任务,每个异步任务检索一个总线路由,然后将它们添加到本地arrays。 但是,Task.WhenAll(…)立即返回,并且本地路由数组的计数为零。 这看起来很奇怪,因为我希望每个任务中的各种“等待”语句意味着流程被暂停,并且任务在完成之前不会返回。 List monitoredTasks = new List(); foreach (BusRouteIdentifier bri in stop.services) { BusRouteRequest req = new BusRouteRequest(bri.id); // Start a new task to fetch the route for each stop Task getRouteTask = Task.Factory.StartNew(async () => { var route = await BusDataProviderManager.DataProvider.DataBroker.getRoute(req); // Add the route to our array (on UI […]

如何在此父方法中等待没有异步修饰符的异步方法?

我有一个方法,我想等待,但我不想导致多米诺骨牌效应,认为任何可以调用此调用方法并等待它。 例如,我有这个方法: public bool Save(string data) { int rowsAffected = await UpdateDataAsync(data); return rowsAffected > 0; } 我打电话给: public Task UpdateDataAsync() { return Task.Run(() => { return Data.Update(); //return an integer of rowsAffected } } 这将无法工作,因为我必须在Save()的方法签名中放入“async”然后我不能返回bool我必须使它成为Task但我不希望任何人等待Save()方法。 有没有办法可以暂停代码执行,如等待或以某种方式等待没有async修饰符的代码?

如果任务等待某事,任务状态将更改为RanToCompletion

这个问题描述了同样的问题 – MSDN Developer Forum 。 这个问题没有得到公认的答案,所给出的任何答案都不能适用于我的案例(因此是一个不同的问题)。 问题也来自我之前提出的问题 ,但是,由于性质和具体问题的不同,我问了一个新问题。 完整代码可以在这里找到: http : //pastebin.com/uhBGWC5e *唯一改变的是任务完成检查( while – > Task.WhenAll )。 等待任务内部的异步操作时,即使任务仍在运行,任务状态也会更改为RanToCompletion 。 现在,让我们看看设置: // Start async. Task t1 = Task.Factory.StartNew(Accept, s1); Task t2 = Task.Factory.StartNew(Accept, s1); Task.WhenAll(t1, t2).Wait(); Accept方法: public static async void Accept(object state) { TcpListenerEx server = (TcpListenerEx) state; IPEndPoint endPoint = server.LocalEndpoint as […]

Task.WaitAll不等待任务完成

在试图弄清楚新的时候(也许现在不是那么新,但对我而言是新的)C#中的Task异步编程,我遇到了一个问题,让我有点想弄清楚,我不知道为什么。 我已经解决了这个问题,但我仍然不确定为什么这是一个问题。 我以为我会分享我的经验,以防任何人遇到同样的情况。 如果有任何大师想告诉我这个问题的原因,那就太棒了,非常感激。 我总是喜欢知道为什么有些东西不起作用! 我做了一个测试任务,如下: Random rng = new Random((int)DateTime.UtcNow.Ticks); int delay = rng.Next(1500, 15000); Task<Task> testTask = Task.Factory.StartNew<Task>( async (obj) => { DateTime startTime = DateTime.Now; Console.WriteLine(“{0} – Starting test task with delay of {1}ms.”, DateTime.Now.ToString(“h:mm:ss.ffff”), (int)obj); await Task.Delay((int)obj); Console.WriteLine(“{0} – Test task finished after {1}ms.”, DateTime.Now.ToString(“h:mm:ss.ffff”), (DateTime.Now – startTime).TotalMilliseconds); return obj; }, […]