在C#async和wait中,全局变量崩溃
C#应用程序在包含各种excel文件的文件夹中搜索匹配字符串,每个文件都有不同的行,并且在每个文件中可能会找到各种匹配字符串。结果将保存在全局变量中。它工作得很好 没有异步任务,但当我尝试异步/等待时,全局变量收到一些错误的结果。我能知道如何解决这个问题吗在C#async和wait中,全局变量崩溃,c#,C#,C#应用程序在包含各种excel文件的文件夹中搜索匹配字符串,每个文件都有不同的行,并且在每个文件中可能会找到各种匹配字符串。结果将保存在全局变量中。它工作得很好 没有异步任务,但当我尝试异步/等待时,全局变量收到一些错误的结果。我能知道如何解决这个问题吗 public IList<SearchList> SearchResult { get; private set; } public async Task ReadExcelData(string stringSearch)
public IList<SearchList> SearchResult { get; private set; }
public async Task ReadExcelData(string stringSearch)
{
string filePath = Path.Combine("D:/test/", "Packing List Folder");
SearchResult = new List<SearchList>();
string[] fileArray = Directory.GetFiles(filePath, "*.xls*", SearchOption.AllDirectories);
List<Task> tasks = new List<Task>();
foreach (var file in fileArray)
{
tasks.Add(Task.Run(() => GetXlData(file, stringSearch)));
}
await Task.WhenAll(tasks);
}
这是我制作的应用程序结构。第一个选项是使用锁 因此,设置锁,访问全局变量,然后再次释放锁。因此,一次只能有一个线程写入变量。但我不会这样做。处理线程时不要使用全局变量 第二种选择: 任务可以返回一些东西
在
任务.whalll
之后,您可以迭代您的任务并获取结果(任务中的结果属性)并将其添加到全局变量。我重写了代码以将GetXlData中的SearchList作为计划返回,但它显示错误CS0029无法将类型“System.Collections.Generic.List”隐式转换为“System.Threading.tasks.Task”,在tasks.Add(Task.Run(()=>GetXlData(file,stringSearch))
可以帮我解决这个错误。谢谢
public IList<SearchList> SearchResult { get; private set; }
public async Task ReadExcelData(string stringSearch)
{
string filePath = Path.Combine("D:/test/", "Packing List Folder");
SearchResult = new List<SearchList>();
string[] fileArray = Directory.GetFiles(filePath, "*.xls*", SearchOption.AllDirectories);
List<Task<SearchList>> tasks = new List<Task<SearchList>>();
foreach (var file in fileArray)
{
tasks.Add(Task.Run(() => GetXlData(file, stringSearch)));
}
var results = await Task.WhenAll(tasks);
foreach (var item in results)
{
SearchResult.Add(item);
}
}
private List<SearchList> GetXlData(string file, string stringSearch)
{
//i guess there is error here but unable fix this.
List<SearchList> container = new List<SearchList>();
using (ExcelEngine excelEngine = new ExcelEngine())
{
// open the file and read every cells here.
if (str == stringSearch)
{
WriteData(PList, unit);
}
container.AddRange((IEnumerable<SearchList>)WriteData(PList, unit));
}
return container;
}
private SearchList WriteData(string cde, string unt)
{
SearchList output = new SearchList
{
Code = cde,
Unit = unt
};
return output;
}
public IList SearchResult{get;private set;}
公共异步任务ReadExcelData(字符串字符串搜索)
{
字符串filePath=Path.Combine(“D:/test/”,“装箱单文件夹”);
SearchResult=新列表();
字符串[]fileArray=Directory.GetFiles(filePath,*.xls*,SearchOption.AllDirectories);
列表任务=新列表();
foreach(fileArray中的var文件)
{
tasks.Add(Task.Run(()=>GetXlData(file,stringSearch));
}
var结果=等待任务.WhenAll(任务);
foreach(结果中的var项目)
{
搜索结果。添加(项);
}
}
私有列表GetXlData(字符串文件、字符串搜索)
{
//我猜这里有错误,但无法修复。
列表容器=新列表();
使用(ExcelEngine=new ExcelEngine())
{
//打开文件并读取此处的每个单元格。
if(str==stringSearch)
{
写入数据(PList,单位);
}
AddRange((IEnumerable)WriteData(PList,unit));
}
返回容器;
}
private SearchList WriteData(字符串cde,字符串unt)
{
SearchList输出=新的SearchList
{
代码=cde,
单位=unt
};
返回输出;
}
感谢大家支持我。谢谢。您有多个线程都在写入搜索结果列表。您是否考虑过使用ConcurrentBag之类的线程安全容器?或者让
GetXlData
返回SearchList
实例,然后您可以使用SearchResult.AddRange(等待任务.Whalll(任务))填充列表代码>在末尾一次性完成我喜欢第二个选项。让GetXlData返回一个搜索列表。我还在钻研编码。你能教我或教我怎么做吗。!!万分感谢
private void WriteData(string cde, string unt)
{
SearchResult.Add(new SearchList
{
Code = cde,
Unit = unt,
});
}
public class SearchList
{
public string Code { get; set; }
public string Unit { get; set; }
public override string ToString()
{
return Code;
}
}
public IList<SearchList> SearchResult { get; private set; }
public async Task ReadExcelData(string stringSearch)
{
string filePath = Path.Combine("D:/test/", "Packing List Folder");
SearchResult = new List<SearchList>();
string[] fileArray = Directory.GetFiles(filePath, "*.xls*", SearchOption.AllDirectories);
List<Task<SearchList>> tasks = new List<Task<SearchList>>();
foreach (var file in fileArray)
{
tasks.Add(Task.Run(() => GetXlData(file, stringSearch)));
}
var results = await Task.WhenAll(tasks);
foreach (var item in results)
{
SearchResult.Add(item);
}
}
private List<SearchList> GetXlData(string file, string stringSearch)
{
//i guess there is error here but unable fix this.
List<SearchList> container = new List<SearchList>();
using (ExcelEngine excelEngine = new ExcelEngine())
{
// open the file and read every cells here.
if (str == stringSearch)
{
WriteData(PList, unit);
}
container.AddRange((IEnumerable<SearchList>)WriteData(PList, unit));
}
return container;
}
private SearchList WriteData(string cde, string unt)
{
SearchList output = new SearchList
{
Code = cde,
Unit = unt
};
return output;
}