【发布时间】:2018-10-01 11:12:16
【问题描述】:
试图将字符串数组的元素传递给在 Task.Run 中调用的函数。任何人都知道这里的错误是什么?
这里的代码不起作用,它的行为就像 ProcessElem 永远不会被调用一样。
string[] arr = message.Split(new string[] {"\n"}, StringSplitOptions.None);
for (int i = 0; i < arr.Length; i++) {
if(arr[i] != "") {
var t = Task.Run(() => this.ProcessElem(arr[i]));
}
}
但是下面的代码可以工作
string[] arr = message.Split(new string[] {"\n"}, StringSplitOptions.None);
for (int i = 0; i < arr.Length; i++) {
if(arr[i] != "") {
var tmp = arr[i];
var t = Task.Run(() => this.ProcessElem(tmp));
}
}
我对 C# 的处理方式非常陌生,但似乎这两种模式都不安全,因为调用 Task.Run() 的函数可能会在 ProcessElem 函数执行之前返回,如果字符串是通过引用传递的,那么它们将在调用 ProcessElem 之前被销毁。
如果是这种情况,将字符串传递到 ProcessElem 的最佳方法是什么?
另外,为什么第一个版本实际上没有“调用”ProcessElem?我在 ProcessElem 的顶部有一个打印语句,它只在第二个版本中打印。
【问题讨论】:
-
什么是“打印声明”?您能否向我们展示“ProcessElem”或显示该问题的精简版本。而且,如果您在 WinForms、WPF、ASP.NET、控制台应用程序中运行什么样的环境......?
-
这是一个控制台应用程序。 ProcessElem 只是打印传递给它的字符串。 public void ProcessElem(string str) { Console.WriteLine(str);}
标签: c# .net thread-safety task