.net 4.0 任务未运行?
我目前遇到的问题是,当按下按钮时,似乎什么都没有发生。我不确定为什么会这样 以下是要按下的按钮的单击方法:.net 4.0 任务未运行?,.net-4.0,task-parallel-library,c#-5.0,.net 4.0,Task Parallel Library,C# 5.0,我目前遇到的问题是,当按下按钮时,似乎什么都没有发生。我不确定为什么会这样 以下是要按下的按钮的单击方法: private void computeStart_Click(object sender, EventArgs e) { _computeTokenSource = new CancellationTokenSource(); GenerateAll(_computeTokenSource.Token); } 以下是单击时调用的方法 private async void
private void computeStart_Click(object sender, EventArgs e)
{
_computeTokenSource = new CancellationTokenSource();
GenerateAll(_computeTokenSource.Token);
}
以下是单击时调用的方法
private async void GenerateAll(CancellationToken token)
{
await new Task(() =>
{
var total = (long) Math.Pow(36, 6);
var options = new ParallelOptions {CancellationToken = token};
Parallel.For(0, total, options, a => GenerateCodeAndHash());
}, TaskCreationOptions.LongRunning);
}
最后,这是在Parallel.For
private void GenerateCodeAndHash()
{
var result = new string(
Enumerable.Repeat(Chars, 6)
.Select(s => s[new Random().Next(s.Length)])
.ToArray());
if (_dictionary.ContainsKey(result)) return;
var hash = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(result));
var sb = new StringBuilder();
for (var j = 0; j < 2; j++)
sb.Append(hash[j].ToString("x2"));
_dictionary.TryAdd(result, sb.ToString());
}
private void GenerateCodeAndHash()
{
var result=新字符串(
可枚举。重复(字符6)
.选择(s=>s[new Random().Next(s.Length)])
.ToArray());
if(_dictionary.ContainsKey(result))返回;
var hash=MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(result));
var sb=新的StringBuilder();
对于(var j=0;j<2;j++)
sb.Append(hash[j].ToString(“x2”);
_TryAdd(result,sb.ToString());
}
不要将任务
构造函数与异步
/等待
一起使用
在这种情况下,您需要使用任务。运行:
private async void computeStart_Click(object sender, EventArgs e)
{
_computeTokenSource = new CancellationTokenSource();
await Task.Run(() => GenerateAll(_computeTokenSource.Token));
}
private void GenerateAll(CancellationToken token)
{
var total = (long) Math.Pow(36, 6);
var options = new ParallelOptions {CancellationToken = token};
Parallel.For(0, total, options, a => GenerateCodeAndHash());
}
有关详细信息,请参阅我的。不要将任务
构造函数与异步
/等待
一起使用
在这种情况下,您需要使用任务。运行:
private async void computeStart_Click(object sender, EventArgs e)
{
_computeTokenSource = new CancellationTokenSource();
await Task.Run(() => GenerateAll(_computeTokenSource.Token));
}
private void GenerateAll(CancellationToken token)
{
var total = (long) Math.Pow(36, 6);
var options = new ParallelOptions {CancellationToken = token};
Parallel.For(0, total, options, a => GenerateCodeAndHash());
}
有关详细信息,请参阅我的。不要将任务
构造函数与异步
/等待
一起使用
在这种情况下,您需要使用任务。运行:
private async void computeStart_Click(object sender, EventArgs e)
{
_computeTokenSource = new CancellationTokenSource();
await Task.Run(() => GenerateAll(_computeTokenSource.Token));
}
private void GenerateAll(CancellationToken token)
{
var total = (long) Math.Pow(36, 6);
var options = new ParallelOptions {CancellationToken = token};
Parallel.For(0, total, options, a => GenerateCodeAndHash());
}
有关详细信息,请参阅我的。不要将任务
构造函数与异步
/等待
一起使用
在这种情况下,您需要使用任务。运行:
private async void computeStart_Click(object sender, EventArgs e)
{
_computeTokenSource = new CancellationTokenSource();
await Task.Run(() => GenerateAll(_computeTokenSource.Token));
}
private void GenerateAll(CancellationToken token)
{
var total = (long) Math.Pow(36, 6);
var options = new ParallelOptions {CancellationToken = token};
Parallel.For(0, total, options, a => GenerateCodeAndHash());
}
有关详细信息,请参阅my。构造函数创建未启动的任务。如果要使用它,需要在之后调用Start()
。但大多数情况下,您希望同时创建和启动任务
,这可以使用Task.Run()
完成
另外,正如其他人所指出的,您应该只在事件处理程序中使用async void
,而不是在其他地方;GenerateAll()
方法应该是async Task
,您应该从事件处理程序中等待它,它应该是async void
任务构造函数创建一个未启动的任务。如果要使用它,需要在之后调用Start()
。但大多数情况下,您希望同时创建和启动任务
,这可以使用Task.Run()
完成
另外,正如其他人所指出的,您应该只在事件处理程序中使用async void
,而不是在其他地方;GenerateAll()
方法应该是async Task
,您应该从事件处理程序中等待它,它应该是async void
任务构造函数创建一个未启动的任务。如果要使用它,需要在之后调用Start()
。但大多数情况下,您希望同时创建和启动任务
,这可以使用Task.Run()
完成
另外,正如其他人所指出的,您应该只在事件处理程序中使用async void
,而不是在其他地方;GenerateAll()
方法应该是async Task
,您应该从事件处理程序中等待它,它应该是async void
任务构造函数创建一个未启动的任务。如果要使用它,需要在之后调用Start()
。但大多数情况下,您希望同时创建和启动任务
,这可以使用Task.Run()
完成
另外,正如其他人所指出的,您应该只在事件处理程序中使用async void
,而不是在其他地方;GenerateAll()
方法应该是async Task
,你应该从事件处理程序中等待它,它应该是async void
你是否检查了页面是否正在加载。如果页面加载事件被触发,请显示你的源代码。@GovindaRajbhar这不是页面,它是windows窗体。我应该指定。Math.Pow(36,6)
将溢出64位整数。这显然不是问题的重点new Random()
如果在同一毫秒内调用,将始终返回相同的随机数。同步对_字典的访问。是否检查了页面是否正在加载。如果触发了页面加载事件,请显示您的源代码。@GovindaRajbhar它不是页面,而是windows窗体。我应该指定。Math.Pow(36,6)
将溢出64位整数。这显然不是问题的重点new Random()
如果在同一毫秒内调用,将始终返回相同的随机数。同步对_字典的访问。是否检查了页面是否正在加载。如果触发了页面加载事件,请显示您的源代码。@GovindaRajbhar它不是页面,而是windows窗体。我应该指定。Math.Pow(36,6)
将溢出64位整数。这显然不是问题的重点new Random()
如果在同一毫秒内调用,将始终返回相同的随机数。同步对_字典的访问。是否检查了页面是否正在加载。如果触发了页面加载事件,请显示您的源代码。@GovindaRajbhar它不是页面,而是windows窗体。我应该指定。Math.Pow(36,6)
将溢出64位整数。这显然不是问题的重点new Random()
如果在同一毫秒内调用,将始终返回相同的随机数。同步对_dictionary的访问,最好也摆脱void
返回类型,尽管它在这里没有区别;如果计算被取消,这将特别重要。更新了。最好也去掉void
返回类型,尽管它在这里没有什么区别;那个w