问题列表 - 第3996页

C#线程池限制线程

好吧......我给了网站一个公平的搜索,并阅读了很多关于这个主题的帖子.我发现了这个问题:C#中一个简单线程池的代码特别有用.

但是,总是看起来,我需要的东西略有不同.

我查看了MSDN示例,并根据我的需要进行了调整.我引用的示例如下:http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80,printer).aspx

我的问题是这个.我有一组相当简单的代码,它通过HttpWebRequestWebResponse类加载一个网页,并通过一个来读取结果Stream.我在一个线程中触发此方法,因为它需要执行多次.该方法本身很短,但需要触发的次数(每次都有不同的数据)会有所不同.它可以是1到200之间的任何地方.

我读过的所有内容似乎都表明ThreadPool班级是主要候选人.这就是事情变得棘手的事情.我可能需要发出100次这样的事情,但我最多只能运行3个线程(对于这个特定的任务).

我已经尝试设置MaxThreadsThreadPool通过:

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 Mutexlock,除了Semaphore没有"所有者" - 它与线程无关.任何线程都可以调用Releasea Semaphore,而使用Mutexlock,只有获得资源的线程才能释放它.

在下面的示例中,十个线程执行一个循环,Sleep中间有一个语句.A Semaphore确保一次不超过三个线程可以执行该Sleep语句:

class SemaphoreTest
{
    static Semaphore s = new Semaphore(3, 3);  // Available=3; Capacity=3 …
Run Code Online (Sandbox Code Playgroud)

c# multithreading threadpool c#-2.0

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

编程分形

学习分形程序是否有助于清楚地思考某些编程问题?

fractals

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

奇怪的HashMap.put()行为

我正在尝试解决间歇性故障,该故障似乎与从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没有"同步".

java hashmap

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

例外与返回代码:我们是否会丢失一些东西(同时获得其他东西)?

我的问题很模糊: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调用 …

c# exception return-code

8
推荐指数
4
解决办法
3980
查看次数

如何从Visual Studio中引用GAC中的dll?

此程序集位于GAC中:Microsoft.SqlServer.Management.RegisteredServers.dll

如何在Visual Studio中添加对此程序集的引用?

我可以在c:\ windows\assembly \中查看该文件

assemblies gac visual-studio

49
推荐指数
5
解决办法
10万
查看次数

210
推荐指数
5
解决办法
79万
查看次数

使用Reflection.Emit的奇怪参数序列

我最近一直在关注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)

c# reflection reflection.emit dynamicmethod

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

我在哪里可以了解更多关于"蚁群"的优化?

我已经在这里和那里读了一段时间,关于使用"蚁群"模型作为优化各种类型算法的启发式方法.但是,我还没有找到一篇文章或书籍,以介绍的方式讨论蚁群优化,甚至还有很多细节.任何人都可以指点我可以了解更多关于这个想法的资源吗?

algorithm computer-science graph-theory montecarlo ant-colony

8
推荐指数
2
解决办法
1736
查看次数

SQL - 在一个语句中使用查询结果作为另外两个查询的基础

我正在进行概率计算.我有一个查询来计算事件发生的总次数.从这些事件中,我想得到子事件发生的次数.获取总事件的查询长度为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 @字面上粘贴了两次.

sql optimization nested count

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

MVC:存储库和服务

我对存储库中定义的内容的限制以及要留给服务的内容感到困惑.存储库是否应仅创建与数据库中的表匹配的简单实体,还是可以使用这些实体的组合创建复杂的自定义对象?

换句话说:服务是否应该在存储库上进行各种Linq to SQL查询?或者是否应在存储库中预定义所有查询,业务逻辑只是决定调用哪种方法?

asp.net-mvc repository-pattern

5
推荐指数
1
解决办法
2210
查看次数