小编Der*_*all的帖子

从阻塞集合中异步获取

我正在使用a BlockingCollection来实现生产者/消费者模式.我有一个异步循环,用于处理集合中要处理的数据,然后客户端可以在很晚的时候访问它.数据包稀疏地到达,我希望在不使用阻塞调用的情况下完成轮询.

从本质上说,我正在寻找的东西像BeginTakeEndTake不阻塞集合中存在,这样我可以在回调利用内部线程池.它BlockingCollection无论如何都不一定是.任何做我需要的东西都会很棒.

这就是我现在所拥有的._bufferedPackets是一个BlockingCollection<byte[]>:

public byte[] Read(int timeout)
{
    byte[] result;
    if (_bufferedPackets.IsCompleted)
    {
        throw new Exception("Out of packets");
    }
    _bufferedPackets.TryTake(out result, timeout);      
    return result;
}
Run Code Online (Sandbox Code Playgroud)

在伪代码中我喜欢这样的东西:

public void Read(int timeout)
{
    _bufferedPackets.BeginTake(result =>
        {
            var bytes = _bufferedPackets.EndTake(result);
            // Process the bytes, or the resuting timeout
        }, timeout, _bufferedPackets);
}
Run Code Online (Sandbox Code Playgroud)

我有什么选择?我不想将任何线程置于等待状态,因为它有很多其他的IO东西需要处理,而且我会很快耗尽线程.

更新:我已经重写了有问题的代码,以不同的方式使用异步进程,基本上根据超时限制内是否有等待请求来交换回调.这样可以正常工作,但如果有一种方法可以做到这一点而不诉诸定时器并交换lambdas可能导致竞争条件并且很难写(并理解),那么它仍然会很棒.我已经用自己的异步队列实现解决了这个问题,但如果有更标准且经过良好测试的选项,它仍然会很棒.

c# asynchronous task-parallel-library

16
推荐指数
1
解决办法
6001
查看次数

为什么GC System.Threading.OverlappedData需要这么长时间?

我正在通过内存分析器运行我的应用程序来检查泄漏.事情似乎有点好,但我得到了很多这些OverlappedData似乎在终结器队列中徘徊,几乎没有任何东西.它们是通过关闭NetworkStream连接两端的底层而取消的重叠IO的结果.

网络流本身被丢弃.没有NetworkStream任何地方的实时实例.

通常,他们根植于一些被称为OverlappedDataCacheLine.I'm调用EndRead在回调中我做的第一件事,所以没有调用BeginRead应该没有它的相应EndRead.

这是一个非常典型的外观,是谁从工具中保留它

OverlappedData正在帮助

最后它确实得到了GC,但它需要永远 - 大约半小时的时间来杀死一切,当我开始大约一千条流,把它们放入异步呼叫BeginRead并在大约一分钟后关闭它们.

该程序在端口80上对网络服务器稍微重现了这个问题.任何网络服务器都会真正做到.

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        var clients = new List<TcpClient>();
        for (int i = 0; i < 1000; ++i) {
            var client = new TcpClient();
            clients.Add(client);

            client.BeginConnect("localhost", 80, connectResult =>
                {
                    client.EndConnect(connectResult);

                    var stream = client.GetStream();
                    stream.BeginRead(new byte[1000], 0, 1000, result =>
                        {
                            try
                            { …
Run Code Online (Sandbox Code Playgroud)

c# garbage-collection memory-leaks asyncsocket

15
推荐指数
1
解决办法
3015
查看次数

WPF中的Ninject构造函数注入

是否有可能使用ninject进行依赖注入,结果就像我在MVC中可以得到的注入一样.详细说来,如果我使用MVC ninject适配器,我可以将我的Web控制器声明为具有构造函数参数,然后由ninject自动注入.

但是,我没有为WPF找到这样的ninject扩展,这将使我有一个这样的窗口:

public partial class MainWindow : Window
{
    private readonly IService injectedService;
    public MainWindow(IService injectedService) 
    {
        this.injectedService = injectedService;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在没有明确使用IKernel我的主应用程序启动来获取mainwindow的实例的情况下这样做.我更喜欢使用xaml配置的常规方法来获取主窗口和所有后续窗口的实例.

这可能吗?有没有办法挂钩xaml生成的对象创建来修改它以使用Ninject进行构造函数依赖注入.

c# wpf ninject

14
推荐指数
1
解决办法
7330
查看次数

生成具有死亡或多余状态的DFA的正则表达式

我想在我的词法分析器中实现DFA最小化器,但我似乎无法生成看起来不像它已经是表达式的最小DFA的DFA.

我正在使用来自后缀正则表达式的thomson构造构建的NFA构建DFA.这几乎就是龙书中描述的内容.为了使词法分析器使用来自开始状态的epsilon转换来组合几个NFA.正是在这个组合的NFA上应用了DFA算法.

那么,是否有任何"已知"正则表达式将生成一个DFA,它将为死态消除和状态最小化提供一个很好的测试平台?

我当然可以破解一个奇怪的DFA并在其上应用算法,但它不是一个真正的测试用例吗?如果我正在构建DFA的方法不容易出现死状态,那么这些信息就是有价值的,因为那时我可以完全跳过实现状态消除功能.

编辑:如果您需要实现细节以便准确回答,代码可以在github上获得,特别是NFA.csDFA.cs类.另外,我写了一篇关于我正在使用的构造算法的博客文章系列,如果有帮助的话.

regex dfa nfa

8
推荐指数
1
解决办法
2409
查看次数

将键盘快捷键绑定到WPF中视图模型中的命令

我有一个应用程序,其中有UserControl一个工具栏.此工具栏有一个按钮Execute,该按钮又将其命令绑定到ICommand视图模型作为属性公开的派生类.

<Button Grid.Row="0" Command="{Binding ExecuteCommand}">Execute</Button>
Run Code Online (Sandbox Code Playgroud)

现在,我想将它绑定到键盘快捷键(F5).这需要在以后的上下文中绑定,UserControl仅当此用户控件此时可见时才适用.

另一种选择是将它绑定到KeyDown实际包含要执行的文本的文本框中,但是当涉及到如何将事件从控件路由到视图模型中的命令时,我真的很不稳定,而代码中没有真正难看的黑客攻击 - 用户控件的后面.

任何指针都表示赞赏!

c# wpf mvvm

7
推荐指数
1
解决办法
1万
查看次数

将零字节写入网络流是检测闭合连接的可靠方法吗?

我正在开发一个应用程序,其中客户端连接TCP连接,然后触发大量可能需要花费大量时间才能完成的工作.如果用户断开TCP连接,则必须取消此工作.

目前,我正在做的是启动一个定时器,通过这样做定期检查网络流连接:

// stream is a Stream instance
var abort = false;
using (new Timer(x => {
   try
   {
      stream.Write(new byte[0], 0, 0);
   }
   catch (Exception)
   {
      abort = true;
   }
}, null, 1000, 1000))
{
   // Do expensive work here and check abort periodically
}
Run Code Online (Sandbox Code Playgroud)

我本来想阅读CanWrite,CanRead或者Connected他们报告流的最后状态.写零字节是测​​试连接的可靠方法,还是这本身会导致问题?我无法在流上写或读任何真实数据,因为这会弄乱客户端.

c# network-programming stream

7
推荐指数
1
解决办法
807
查看次数

检查组件是否在最外层的LifetimeScope中解析

我正在重新编写现有的代码库,以便更好地使用autofac容器.我遇到的情况是,很多东西都是用经典的ServiceLocator反模式直接从容器中解决它们的组件.我正在使用引入适当的工作单元方案LifetimeScope.

我面临的问题是,某些组件必须在LifetimeScope实施时从孩子身上解决IDisposable,必须予以处置.如果它们在根范围内得到解决,那将永远不会发生.

有没有办法阻止在根范围内解析某些组件?崩溃的运行时可以做到这一点,因为我将逐一介绍这些情况并根据需要引入范围.我能想到的唯一方法就是创建一个小的虚拟组件,它可以为根生存范围解析一次并解析,在.InstancePerLifetimeScope()某个地方静态存储.然后,当解析后面的组件时,我将获得其中一个虚拟组件,并查看它是否与根范围中生命的组件相同.虽然它有点笨拙,还有更好的方法吗?

c# autofac

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

如何在Haskell中使用IO创建随机列表

我正在尝试进行植绒模拟,以便更好地教自己haskell.在尝试生成需要随机性的模拟的初始状态时,我遇到了麻烦.我正在尝试生成一个Boids列表,它们都有随机的初始位置和方向.

在主要功能中,我称之为使用

let numBoids = 10
rBoids <- randomBoids numBoids
Run Code Online (Sandbox Code Playgroud)

rBoids我indend在IOREF,我可以再更新每一帧,我认为这是做事的正确方法来存储?

以下是失败的代码:

-- Type for the flocking algorithm
data Boid = Boid {
    boidPosition  :: Vector2(GLfloat)
  , boidDirection :: Vector2(GLfloat)
  } deriving Show

randomBoids :: Int -> IO ([Boid])
randomBoids 0 = do
  return []
randomBoids n = do
  b <- randomBoid 
  bs <- (randomBoids (n-1))
  return b : bs

randomBoid = do
  pos <- randomVector
  vel <- randomVector
  return (Boid pos vel)

randomVector = do
  x <- …
Run Code Online (Sandbox Code Playgroud)

io monads haskell

4
推荐指数
2
解决办法
282
查看次数

绘制位图C#

我试图用位图类在屏幕上绘制图像,但有些不对劲.

这是我的代码:

Bitmap bm = new Bitmap(@"C:\Alan\University\111.jpg");
Graphics g = Graphics.FromImage(bm);
g.DrawImage(bm,60,60);
Run Code Online (Sandbox Code Playgroud)

运行代码后,我的屏幕上没有任何附加信息.我的代码有什么问题?谢谢

c# winforms

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

不使用SQL中的聚合函数的最高/最低值

我有一个名为的表department,其中包含以下数据

DNO DNAME   SALARY
20  EE  30000
10  DoC 50000
30  ITS 20000
Run Code Online (Sandbox Code Playgroud)

我想选择具有最高和最低工资的员工而不使用GROUP函数或top-n分析或NOT EXISTS命令.任何帮助将不胜感激.谢谢

mysql sql database postgresql

0
推荐指数
1
解决办法
1万
查看次数