【发布时间】:2014-07-27 16:47:20
【问题描述】:
我知道生成器存在一个问题,因为它们有时速度太快,最终会生成两次相同的字符,或者根本不生成。我正在创建一个生成随机字符的程序,并且我想包含一个进度条,我将使用异步生成来实现它。
问题在于它无法正确生成,因为它生成得太快了。我会告诉它生成 3 组字符,它会做 1 组,或者 5 组,它会做 2 组。
如何减慢速度并让它异步生成,或者如何以其他方式实现工作进度条?
这是我的一些代码:
private void btnGenerate_Click(object sender, EventArgs e) {
Random rand = new Random();
string result;
bool failed = false;
int amount = Convert.ToInt32(numMassGen.Value),
initialAmount = amount;
while(0 < amount--) {
result = Generate(rand).Result;
if(result != "failed") {
WriteToFile(result, initialAmount - amount);
statusText.Text = "Finished generating and saving " + (initialAmount - amount) + "/" + initialAmount + " keys.";
}
else {
UpdateStatus("Not enough options selected for this length.");
failed = true;
break;
}
}
if(!failed) {
UpdateStatus("Finished generating and saving " + numMassGen.Value + " keys.");
}
}
private Task WriteToFile(string result, int completed) {
return WriteToFileAsync(result);
}
private async Task WriteToFileAsync(string result) {
byte[] resultEncoded = Encoding.UTF8.GetBytes(result + Environment.NewLine);
using(FileStream stream = new FileStream(txtSaveLocation.Text,
FileMode.Append,
FileAccess.Write,
FileShare.None,
bufferSize: 4096,
useAsync: true)) {
await stream.WriteAsync(resultEncoded, 0, resultEncoded.Length);
}
}
// This method's probably crude, it's a little old and I don't know
// how to improve it.
// This is also where the problems occur. When I step through this code,
// it's slowing down the random generation.
// When I run it normally, it's too fast and skips generating.
private async Task<string> GenerateAsync(Random rand) {
string sAll = "", result = "", sLower, sUpper, sNumbers, sHyphen, sUnderscore, sSpace, sSpecial, sBrackets;
int length = Convert.ToInt32(numSections.Value) * Convert.ToInt32(numCharacters.Value),
initialLength = length;
char character;
sLower = "abcdefghijklmnopqrstuvwxyz";
sUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
sNumbers = "0123456789";
sHyphen = "-";
sUnderscore = "_";
sSpace = " ";
sSpecial = "`~!@#$%^&*()+=\\|/?.,;:'\"";
sBrackets = "()[]{}<>";
if(Properties.Settings.Default.charUppercase)
sAll += sUpper;
if(Properties.Settings.Default.charLowercase)
sAll += sLower;
if(Properties.Settings.Default.charNumbers)
sAll += sNumbers;
if(Properties.Settings.Default.charUnderscore)
sAll += sUnderscore;
if(Properties.Settings.Default.charSpace)
sAll += sSpace;
if(Properties.Settings.Default.charSpecial)
sAll += sSpecial;
if(Properties.Settings.Default.charBrackets)
sAll += sBrackets;
while(0 < length) {
if(sAll.Length == 0) {
return "failed";
}
character = sAll[rand.Next(sAll.Length)];
if(Properties.Settings.Default.charRepeat) {
sAll = sAll.Remove(sAll.IndexOf(character), 1);
}
if((length % Properties.Settings.Default.secCharacters == 0) && (length != 0) && (length != initialLength)) {
result += sHyphen;
}
result += character;
length--;
}
return result;
}
【问题讨论】:
-
如果可能的话,你可以锁定一个对象。或者你需要建立一个节流机制。更多地取决于您的系统设计
-
告诉我们,你到目前为止尝试了什么。
-
我不知道你在说什么。可以发一些代码吗?
-
完全不清楚你在说什么。您在哪里知道“生成器两次生成相同的字符”。你的假设的来源是什么?
-
@Samuel 对此感到非常抱歉......我度过了艰难的一天。我已经发布了一些(希望是清晰的)代码并在一些 cmets 中进行了解释。我之前问过一个问题,或者谷歌了一下,为什么我的随机生成的字符有时会连续出现两次,有些答案说这是因为进程运行得太快,需要时间来生成另一个字符。
标签: c# asynchronous random generator