使File下载安全

时间:2018-01-24 16:28:20

标签: c# .net multithreading thread-safety

我有一个场景,我必须从api调用中获取客户的xml文件,然后在第一次请求时将其保存在我的计算机中,之后该客户的每个请求都将使用我的计算机文件来获取特定客户的数据。

例如,如果我有两个客户ABC和XYZ。让我说ABC的第一个请求我想开始下载ABC的文件。在下载正在进行时,请说XYZ的第一个请求来。我想继续下载XYZ客户文件。但是让我们说下载正在进行中ABC和ABC的另一个请求来我应该让它等到ABC的文件正在下载,文件下载之后我想从该文件中获取第二个请求的数据。

我考虑2个解决方案,例如,如果我锁定下载代码

// code
lock(obj)
{
   DownloadXmle("ABC");
}
// code

第二个选项是,如果我声明一个静态列表,在下载文件之前,我在该列表中推送客户编号,并且对于该客户的所有其他请求,它检查机构编号是否在该列表中,它应该等待

//code
currentlyDownloadingFileList.add("ABC");
 DownloadXmle("ABC");
currentlyDownloadingFileList.Remove("ABC");
//code

还有更好的事情吗?

2 个答案:

答案 0 :(得分:1)

您应该使用ConcurrentDictionary<string, object>来存储线程安全的客户地图以锁定对象。

使用GetOrAdd()安全地获取客户的锁定对象,然后锁定该对象。

答案 1 :(得分:1)

在我看来,最好使用TPL。 TextView应该是异步方法,它返回DownloadXmleTask<T>。它将帮助您获得更好的资源利用率,并为您的任务提供强大的工具。在这种情况下,让我们看看你的方法实现:

Task

接下来,当你打电话给你时,你应该在某处保存返回的任务:

public async Task DownloadXmleAsync(string customer)
{
...
}

当您收到该客户的新请求时,您应该做下一步:

Task taskAbc = DownloadXmleAsync("ABC");

ContinueWith将安排您的下一个电话,并且只有在第一个请求完成后才会运行。无论如何,第二项任务都将运行。 taskAbc = taskAbc.ContinueWith(prevTask => DownloadXmleAsync("ABC")); 将是第二个任务的链接。每当您收到新请求时,它都会安排。