如何获取被线程锁定的函数中访问或失败的等待时间
本文关键字:函数 访问 等待时间 失败 锁定 线程 何获取 获取 | 更新日期: 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);
}
}
这将显示代码部分的各个时间:获取锁,然后实际将值添加到数组中(即后者不包括获取锁所花费的时间)。
如果这不是您真正想要做的,请编辑您的问题,使其更清晰。