如何获取被线程锁定的函数访问或失败的等待时间?

How can I get the the waiting times for access or failing in a function that is locked by threads?

我正在使用一个函数在动态数组中添加一些值(我知道我可以使用一个列表,但这是我必须使用数组的要求)。

现在一切正常,但我需要知道线程何时无法添加值(因为它被锁定并节省时间)以及何时添加它(我想当它添加时,我已经像你一样拥有它可以在函数Add.

中看到

插入数据:

private void button6_Click(object sender, EventArgs e)
{
    showMessage(numericUpDown5.Value.ToString());
    showMessage(numericUpDown6.Value.ToString());

    for (int i = 0; i < int.Parse(numericUpDown6.Value.ToString()); i++)
    {
        ThreadStart start = new ThreadStart(insertDataSecure);
        new Thread(start).Start();
    }
}

private void insertDataSecure()
{
    for (int i = 0; i < int.Parse(numericUpDown5.Value.ToString()); i++)
        sArray.addSecure(i);

    MessageBox.Show(String.Format("Finished data inserted, you can check the result in: {0}", Path.Combine(
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
"times.txt")), "Result", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

要添加的函数:

private object padLock = new object();
public void addSecure(int value)
{
    Stopwatch sw = Stopwatch.StartNew();
    string values = "";

    lock (padLock)
    {
        try
        {
            if (array == null)
            {
                this.size = 1;
                Resize(this.size);

                array[0] = value;
                count++;
            }
            else
            {
                count++;
                if (size == count)
                {
                    size *= 2;
                    Resize(size);
                }

                array[count - 1] = value;
            }
        }
        catch
        {
            throw new System.ArgumentException("It was impossible to insert, try again later.", "insert");
        }

        values=String.Format("Element {0}, Time taken: {1}ms", value.ToString(), sw.Elapsed.TotalMilliseconds);
        sw.Stop();
        saveFile(values);
    }

很抱歉问这个问题,但我阅读了不同的文章,这是我尝试使用的最后一篇文章:http://msdn.microsoft.com/en-us/library/4tssbxcw.aspx 但是当我尝试在我的代码中实现时,最终因一个奇怪的错误而崩溃。

恐怕我不能完全理解这个问题。听起来您想知道从线程启动到实际获取锁之间需要多长时间。但在那种情况下,线程实际上并没有未能添加一个值;它只是延迟了一段时间。

另一方面,您确实有一个异常处理程序,所以大概有一些您期望 Resize() 方法可以抛出异常的场景(但您应该只捕获 那些你期望并且知道你可以处理的异常......一个裸露的 catch 子句不是一个好主意,尽管你确实抛出 some 的事实在一定程度上减轻了危害异常处理程序)。所以我不禁想知道 that 是否就是你所说的失败。

就是说,假设前面的解释是正确的——您想要计算获取锁需要多长时间——那么对您的代码进行以下更改应该可以做到这一点:

public void addSecure(int value)
{
    Stopwatch sw = Stopwatch.StartNew();
    string values = "";

    lock (padLock)
    {
        // Save the current timer value here
        TimeSpan elapsedToAcquireLock = sw.Elapsed;

        try
        {
            if (array == null)
            {
                this.size = 1;
                Resize(this.size);

                array[0] = value;
                count++;
            }
            else
            {
                count++;
                if (size == count)
                {
                    size *= 2;
                    Resize(size);
                }

                array[count - 1] = value;
            }
        }
        catch
        {
            throw new System.ArgumentException("It was impossible to insert, try again later.", "insert");
        }

        sw.Stop();
        values = string.Format(
            "Element {0}, Time taken: for lock acquire: {1}ms, for append operation: {2}ms",
             value.ToString(),
             elapsedToAcquireLock.TotalMilliseconds,
             sw.Elapsed.TotalMilliseconds - elapsedToAcquireLock.TotalMilliseconds);
        saveFile(values);
    }
}

这将显示代码部分的各个时间:获取锁,然后实际将值添加到数组(即后者 包括花费的时间获取锁)。

如果这实际上不是您想要做的,请编辑您的问题以使其更清楚。