如何获取被线程锁定的函数访问或失败的等待时间?
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);
}
}
这将显示代码部分的各个时间:获取锁,然后实际将值添加到数组(即后者 不 包括花费的时间获取锁)。
如果这实际上不是您想要做的,请编辑您的问题以使其更清楚。
我正在使用一个函数在动态数组中添加一些值(我知道我可以使用一个列表,但这是我必须使用数组的要求)。
现在一切正常,但我需要知道线程何时无法添加值(因为它被锁定并节省时间)以及何时添加它(我想当它添加时,我已经像你一样拥有它可以在函数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);
}
}
这将显示代码部分的各个时间:获取锁,然后实际将值添加到数组(即后者 不 包括花费的时间获取锁)。
如果这实际上不是您想要做的,请编辑您的问题以使其更清楚。