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

本文关键字:函数 访问 等待时间 失败 锁定 线程 何获取 获取 | 更新日期: 2023-09-27 18:36:26

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

现在一切正常,但我需要知道线程何时无法添加值(因为它已锁定并节省时间)以及何时添加它(我认为当它添加时,我已经有了它,正如您在函数中看到的那样添加。

插入数据:

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子句不是一个好主意,尽管你确实抛出了一些异常处理程序,这一事实在一定程度上减轻了危害)。所以我不禁怀疑是否是你所说的失败。

也就是说,假设前一种解释是正确的 - 你想要计时获取锁所需的时间 - 那么对代码的以下更改应该这样做:

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);
    }
}

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

如果这不是您真正想要做的,请编辑您的问题,使其更清晰。