【问题标题】:Thread blocking issue线程阻塞问题
【发布时间】:2013-04-17 12:16:37
【问题描述】:

我的线程有问题或 BeginInvoke 阻塞了我的数据操作的整个过程,我像这样启动线程或调用

private void StartRetweetMarch(string twStatusId)
{
    foreach (var line in _emailBox.Lines)
    {

        //new Action<object>(Hashtags).BeginInvoke(new Email { twStatus = twStatusId, login = line.Split(':')[0], password = line.Split(':')[1] }, null, null);
        new Thread(new ParameterizedThreadStart(Hashtags)).Start(new Email { twStatus = twStatusId, login = line.Split(':')[0], password = line.Split(':')[1] });
        //_threads.Add(new Action<object>(Hashtags).BeginInvoke(new Email { login = line.Split(':')[0], password = line.Split(':')[1] }, null, null));
        //Thread.Sleep(40000);w
        // new Thread(new ParameterizedThreadStart(Hashtags)).Start(new Email { login = line.Split(':')[0], password = line.Split(':')[1] });
    }
}

但只是这个foreach调用的第一个调用,其他的都在等待中或者类似的,我不知道该怎么做。

【问题讨论】:

  • Hashtags 方法是什么样的?您是否尝试过调试代码并验证该方法实际上只调用了一次?什么是阻塞的堆栈跟踪? (您可以通过手动中断调试器然后查看调用堆栈来发现这一点。)您不是在某个地方遇到异常吗?
  • @svick 这里是 PasteBin pastebin.com/XuZSpvuW
  • 我的其他问题呢?
  • @svick 是的,我尝试调试我的代码,方法在 FIRST foreach 循环启动时被调用了很多次,我没有例外

标签: c# multithreading blocking


【解决方案1】:

在 Hashtags 方法内部,它看起来不是线程安全的。比如_proxies变量,我不确定这个类型,但是如果你只是使用List类型,那么你必须写排他锁。

//Outside of Method...
//Create lock Object
private static object _lock = new Object();

//Inside of Hashtags Method...
//exclusive lock. Inside of code block is thread safe. 
lock (_lock) {
    prox = _proxies[new Random().Next(0, _proxies.Count)];
    _proxies.Remove(prox);
}

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2016-01-27
    相关资源
    最近更新 更多