.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