好吧......我给了网站一个公平的搜索,并阅读了很多关于这个主题的帖子.我发现了这个问题:C#中一个简单线程池的代码特别有用.
但是,总是看起来,我需要的东西略有不同.
我查看了MSDN示例,并根据我的需要进行了调整.我引用的示例如下:http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80,printer).aspx
我的问题是这个.我有一组相当简单的代码,它通过HttpWebRequest和WebResponse类加载一个网页,并通过一个来读取结果Stream.我在一个线程中触发此方法,因为它需要执行多次.该方法本身很短,但需要触发的次数(每次都有不同的数据)会有所不同.它可以是1到200之间的任何地方.
我读过的所有内容似乎都表明ThreadPool班级是主要候选人.这就是事情变得棘手的事情.我可能需要发出100次这样的事情,但我最多只能运行3个线程(对于这个特定的任务).
我已经尝试设置MaxThreads上ThreadPool通过:
ThreadPool.SetMaxThreads(3, 3);
Run Code Online (Sandbox Code Playgroud)
我并不完全相信这种方法有效.此外,我不想破坏将在其上运行的系统上运行的其他网站或程序.因此,通过限制线程的#ThreadPool,我可以确定这仅适用于我的代码和我的线程吗?
MSDN示例使用事件驱动方法和调用WaitHandle.WaitAll(doneEvents);,这就是我这样做的方式.
所以我的问题的核心是,如何确保或指定可以为其代码运行的最大线程数,但让代码继续运行更多线程,因为之前的线程完成直到任意点?我是以正确的方式解决这个问题吗?
此致
贾森
好的,我添加了一个信号量方法并完全删除了ThreadPool代码.看起来很简单.我从http://www.albahari.com/threading/part2.aspx获取了我的信息
这个例子向我展示了如何:
[此处的文字是网站的复制/粘贴]
Semaphore容量为1的A 类似于a Mutex或lock,除了Semaphore没有"所有者" - 它与线程无关.任何线程都可以调用Releasea Semaphore,而使用Mutex和lock,只有获得资源的线程才能释放它.
在下面的示例中,十个线程执行一个循环,Sleep中间有一个语句.A Semaphore确保一次不超过三个线程可以执行该Sleep语句:
class SemaphoreTest
{
static Semaphore s = new Semaphore(3, 3); // Available=3; Capacity=3 …Run Code Online (Sandbox Code Playgroud) 我正在尝试解决间歇性故障,该故障似乎与从HashMap中删除对象然后使用新密钥放回同一对象有关.我的HashMap创建如下:
transactions = new HashMap<Short, TransactionBase>();
Run Code Online (Sandbox Code Playgroud)
执行重新分配的代码如下:
transactions.remove(transaction.tran_no);
transaction.tran_no = generate_transaction_id();
transactions.put(transaction.tran_no, transaction);
Run Code Online (Sandbox Code Playgroud)
我看到的间歇性行为是,在此之后立即执行的代码依赖于可定位的事务对象,似乎不会使用新的事务id找到事务对象.但是,在将来的某个时刻,可以找到交易.所以拉扯秸秆,put()或删除会产生这种行为的异步效果吗?
我应该提一下,据我所知,容器只能由一个线程访问.我已经在文档中读到类HashMap没有"同步".
我的问题很模糊:o) - 但这是一个例子:
当我编写C代码时,我能够在出现故障时记录计数器的值:
<...>
for ( int i = 0 ; i < n ; i++ )
if ( SUCCESS != myCall())
Log( "Failure, i = %d", i );
<...>
Run Code Online (Sandbox Code Playgroud)
现在,使用异常,我得到这个:
try
{
<...>
for ( int i = 0 ; i < n ; i++ )
myCall();
<...>
}
catch ( Exception exception )
{
Log( "Failure ! Maybe in myCall() ? Don't know. i's value ? No clue." );
}
Run Code Online (Sandbox Code Playgroud)
当然,可以在try/catch语句之外声明"i"(这就是我正在做的事情).但我不喜欢它 - 我喜欢声明变量在哪里使用,而不是之前.
但也许我在这里遗漏了一些东西.你有什么优雅的解决方案吗?
预先感谢 !西尔万.
ADDED:myCall()是一个不起眼的API调用 …
此程序集位于GAC中:Microsoft.SqlServer.Management.RegisteredServers.dll
如何在Visual Studio中添加对此程序集的引用?
我可以在c:\ windows\assembly \中查看该文件
如何清除单元格中的值并使其为NULL?
我最近一直在关注Reflection.Emit.我写了一个简单的程序,它生成一个DynamicMethod,它简单地调用另一个具有相同参数的方法
class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Test();
}
public delegate void TestHandler(int a, int b, int c, int d, int e, int f);
public void Test()
{
DynamicMethod method = new DynamicMethod(string.Empty, typeof(void), new[] { typeof(Int32), typeof(Int32), typeof(Int32), typeof(Int32), typeof(Int32), typeof(Int32) }, typeof(Program));
MethodInfo method1 = typeof(Program).GetMethod("Question",BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,null,new Type[]{typeof(Int32),typeof(Int32),typeof(Int32),typeof(Int32),typeof(Int32),typeof(Int32)},null);
MethodInfo method2 = typeof(MethodBase).GetMethod("GetCurrentMethod", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null);
MethodInfo method3 = typeof(Console).GetMethod("WriteLine", BindingFlags.Static …Run Code Online (Sandbox Code Playgroud) 我已经在这里和那里读了一段时间,关于使用"蚁群"模型作为优化各种类型算法的启发式方法.但是,我还没有找到一篇文章或书籍,以介绍的方式讨论蚁群优化,甚至还有很多细节.任何人都可以指点我可以了解更多关于这个想法的资源吗?
algorithm computer-science graph-theory montecarlo ant-colony
我正在进行概率计算.我有一个查询来计算事件发生的总次数.从这些事件中,我想得到子事件发生的次数.获取总事件的查询长度为25行,我不想只复制+粘贴两次.
我想对此查询执行两项操作:计算其中的行数,并计算此查询的查询结果中的行数.现在,我能想到的唯一方法就是这样做(用复杂的查询替换@ total @来获取所有行,而@ conditions @用不太复杂的条件替换来自@ total @的行必须匹配子事件):
SELECT (SELECT COUNT(*) FROM (@total@) AS t1 WHERE @conditions@) AS suboccurs,
COUNT(*) AS totaloccurs FROM (@total@) as t2
Run Code Online (Sandbox Code Playgroud)
如你所知,@ total @重复两次.有没有办法解决?有没有更好的方法来做我想做的事情?
重新强调:@condition @取决于@otal @返回的内容(它确实如此t1.foo = bar).
最后的一些注意事项:@ total @本身需要~250ms.这个更复杂的查询需要大约300毫秒,因此postgres可能会进行一些优化.尽管如此,查询看起来非常难看,@ total @字面上粘贴了两次.
我对存储库中定义的内容的限制以及要留给服务的内容感到困惑.存储库是否应仅创建与数据库中的表匹配的简单实体,还是可以使用这些实体的组合创建复杂的自定义对象?
换句话说:服务是否应该在存储库上进行各种Linq to SQL查询?或者是否应在存储库中预定义所有查询,业务逻辑只是决定调用哪种方法?
c# ×3
sql ×2
algorithm ×1
ant-colony ×1
asp.net-mvc ×1
assemblies ×1
c#-2.0 ×1
count ×1
exception ×1
fractals ×1
gac ×1
graph-theory ×1
hashmap ×1
java ×1
montecarlo ×1
nested ×1
optimization ×1
reflection ×1
return-code ×1
sql-server ×1
ssms ×1
threadpool ×1