在C#async和wait中,全局变量崩溃

在C#async和wait中,全局变量崩溃,c#,C#,C#应用程序在包含各种excel文件的文件夹中搜索匹配字符串,每个文件都有不同的行,并且在每个文件中可能会找到各种匹配字符串。结果将保存在全局变量中。它工作得很好 没有异步任务,但当我尝试异步/等待时,全局变量收到一些错误的结果。我能知道如何解决这个问题吗 public IList<SearchList> SearchResult { get; private set; } public async Task ReadExcelData(string stringSearch)

C#应用程序在包含各种excel文件的文件夹中搜索匹配字符串,每个文件都有不同的行,并且在每个文件中可能会找到各种匹配字符串。结果将保存在全局变量中。它工作得很好 没有异步任务,但当我尝试异步/等待时,全局变量收到一些错误的结果。我能知道如何解决这个问题吗

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;
    }