C# 中 两台电脑同时调用同一个http接口,在C#中怎么写这个接口能互不干扰. 在第一台电脑调用接口未返回的情况下,第二台电脑也能正常调用接口并且返回
时间: 2024-12-11 22:38:38 浏览: 11
在C#中设计一个能够处理并发请求并保证数据独立性的HTTP接口,通常会利用异步编程模型和线程同步机制。你可以使用`async`和`await`关键字,以及`HttpClient`类来实现这种场景。这里是一个基本的示例:
```csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class ConcurrentHttpService
{
private readonly HttpClient _httpClient;
private static object _lock = new object(); // 锁用于控制并发访问
public ConcurrentHttpService()
{
_httpClient = new HttpClient();
}
// 使用 async 方法和 await 关键字处理并发请求
public async Task<string> GetApiDataAsync(string apiUrl)
{
try
{
// 获取锁,防止多线程同时操作
lock (_lock)
{
// 异步发送请求,通过Task.Run让请求在单独的线程上执行
var response = await Task.Run(() => _httpClient.GetStringAsync(apiUrl));
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
throw new Exception($"Failed to fetch data from API ({response.StatusCode})");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error occurred while fetching data: {ex.Message}");
// 返回错误信息或其他默认值
return "Error";
}
}
}
// 调用示例
public async void CallApiOnBothMachines()
{
ConcurrentHttpService service = new ConcurrentHttpService();
// 第一台电脑调用
string result1 = await service.GetApiDataAsync("api-url-for-machine1");
// 第二台电脑在同一时间调用,不会阻塞
string result2 = await service.GetApiDataAsync("api-url-for-machine2");
}
```
在这个示例中,每台电脑可以同时调用`GetApiDataAsync`方法,因为它们都在各自的线程上运行,并通过锁 `_lock` 来控制对网络资源的访问。这样就实现了互不干扰。
阅读全文