我正在使用a BlockingCollection来实现生产者/消费者模式.我有一个异步循环,用于处理集合中要处理的数据,然后客户端可以在很晚的时候访问它.数据包稀疏地到达,我希望在不使用阻塞调用的情况下完成轮询.
从本质上说,我正在寻找的东西像BeginTake和EndTake不阻塞集合中存在,这样我可以在回调利用内部线程池.它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可能导致竞争条件并且很难写(并理解),那么它仍然会很棒.我已经用自己的异步队列实现解决了这个问题,但如果有更标准且经过良好测试的选项,它仍然会很棒.
我正在通过内存分析器运行我的应用程序来检查泄漏.事情似乎有点好,但我得到了很多这些OverlappedData似乎在终结器队列中徘徊,几乎没有任何东西.它们是通过关闭NetworkStream连接两端的底层而取消的重叠IO的结果.
网络流本身被丢弃.没有NetworkStream任何地方的实时实例.
通常,他们根植于一些被称为OverlappedDataCacheLine.I'm调用EndRead在回调中我做的第一件事,所以没有调用BeginRead应该没有它的相应EndRead.
这是一个非常典型的外观,是谁从工具中保留它

最后它确实得到了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) 是否有可能使用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进行构造函数依赖注入.
我想在我的词法分析器中实现DFA最小化器,但我似乎无法生成看起来不像它已经是表达式的最小DFA的DFA.
我正在使用来自后缀正则表达式的thomson构造构建的NFA构建DFA.这几乎就是龙书中描述的内容.为了使词法分析器使用来自开始状态的epsilon转换来组合几个NFA.正是在这个组合的NFA上应用了DFA算法.
那么,是否有任何"已知"正则表达式将生成一个DFA,它将为死态消除和状态最小化提供一个很好的测试平台?
我当然可以破解一个奇怪的DFA并在其上应用算法,但它不是一个真正的测试用例吗?如果我正在构建DFA的方法不容易出现死状态,那么这些信息就是有价值的,因为那时我可以完全跳过实现状态消除功能.
编辑:如果您需要实现细节以便准确回答,代码可以在github上获得,特别是NFA.cs和DFA.cs类.另外,我写了一篇关于我正在使用的构造算法的博客文章系列,如果有帮助的话.
我有一个应用程序,其中有UserControl一个工具栏.此工具栏有一个按钮Execute,该按钮又将其命令绑定到ICommand视图模型作为属性公开的派生类.
<Button Grid.Row="0" Command="{Binding ExecuteCommand}">Execute</Button>
Run Code Online (Sandbox Code Playgroud)
现在,我想将它绑定到键盘快捷键(F5).这需要在以后的上下文中绑定,UserControl仅当此用户控件此时可见时才适用.
另一种选择是将它绑定到KeyDown实际包含要执行的文本的文本框中,但是当涉及到如何将事件从控件路由到视图模型中的命令时,我真的很不稳定,而代码中没有真正难看的黑客攻击 - 用户控件的后面.
任何指针都表示赞赏!
我正在开发一个应用程序,其中客户端连接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他们报告流的最后状态.写零字节是测试连接的可靠方法,还是这本身会导致问题?我无法在流上写或读任何真实数据,因为这会弄乱客户端.
我正在重新编写现有的代码库,以便更好地使用autofac容器.我遇到的情况是,很多东西都是用经典的ServiceLocator反模式直接从容器中解决它们的组件.我正在使用引入适当的工作单元方案LifetimeScope.
我面临的问题是,某些组件必须在LifetimeScope实施时从孩子身上解决IDisposable,必须予以处置.如果它们在根范围内得到解决,那将永远不会发生.
有没有办法阻止在根范围内解析某些组件?崩溃的运行时可以做到这一点,因为我将逐一介绍这些情况并根据需要引入范围.我能想到的唯一方法就是创建一个小的虚拟组件,它可以为根生存范围解析一次并解析,在.InstancePerLifetimeScope()某个地方静态存储.然后,当解析后面的组件时,我将获得其中一个虚拟组件,并查看它是否与根范围中生命的组件相同.虽然它有点笨拙,还有更好的方法吗?
我正在尝试进行植绒模拟,以便更好地教自己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) 我试图用位图类在屏幕上绘制图像,但有些不对劲.
这是我的代码:
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)
运行代码后,我的屏幕上没有任何附加信息.我的代码有什么问题?谢谢
我有一个名为的表department,其中包含以下数据
DNO DNAME SALARY
20 EE 30000
10 DoC 50000
30 ITS 20000
Run Code Online (Sandbox Code Playgroud)
我想选择具有最高和最低工资的员工而不使用GROUP函数或top-n分析或NOT EXISTS命令.任何帮助将不胜感激.谢谢
c# ×7
wpf ×2
asynchronous ×1
asyncsocket ×1
autofac ×1
database ×1
dfa ×1
haskell ×1
io ×1
memory-leaks ×1
monads ×1
mvvm ×1
mysql ×1
nfa ×1
ninject ×1
postgresql ×1
regex ×1
sql ×1
stream ×1
winforms ×1