C# 定期查询服务器并在另一个值之外返回特定值的最佳方法

C# 定期查询服务器并在另一个值之外返回特定值的最佳方法,c#,.net,json,C#,.net,Json,也许标题不够好,我知道。这是我的问题 我目前正在为一个程序编写一个类库,该程序处理补丁的新版本检查和下载。 一个专用的更新框架对我来说是没有选择的,因为它们大多过于臃肿。我真的只想查询服务器,检查新版本,如果有新版本,下载补丁 在我当前的设置中,我有一个类,它调用返回json编码文本文档的服务器(现在,我们将在稍后切换TowerBapi2)。然后,JSON.NET将该文本文档反序列化为以下c#对象的列表 ///表示修补程序。 ///ToDo:实现iComparable和IEquatable 公共

也许标题不够好,我知道。这是我的问题

我目前正在为一个程序编写一个类库,该程序处理补丁的新版本检查和下载。 一个专用的更新框架对我来说是没有选择的,因为它们大多过于臃肿。我真的只想查询服务器,检查新版本,如果有新版本,下载补丁

在我当前的设置中,我有一个类,它调用返回json编码文本文档的服务器(现在,我们将在稍后切换TowerBapi2)。然后,JSON.NET将该文本文档反序列化为以下c#对象的列表

///表示修补程序。
///ToDo:实现iComparable和IEquatable
公共类补丁
{
///初始化类的新实例。
///修补程序的版本。
[JsonConstructor]
公共修补程序(字符串版本)
:此(新版本(版本))
{
}
///初始化类的新实例。
///修补程序的版本为字符串。
公共修补程序(版本)
{
这个。版本=版本;
}
///获取修补程序的版本。
[JsonConverter(typeof(VersionConverter))]
公共版本版本{get;private set;}
///获取或设置修补程序的大小。
公共长长度{get;set;}
///获取或设置主下载uri。
公共Uri下载Uri{get;set;}
///获取或设置回退下载uri。
公共Uri回退Uri{get;set;}
}
在反序列化之后,我遍历所述列表并检查是否有新版本可用。如果有新版本可用,则该方法返回true。如果没有可用的新版本,则该方法返回false

现在我不知道返回version对象本身的最佳方式是什么。我可以使用out参数来实现这一点,但我不确定这是否是最好的方法。特别是因为checking方法必须重新运行,直到返回false(这意味着程序是最新版本)

有可能发生这样的事件吗?一个元组怎么样?还是我完全错过了什么

//编辑:对于那些感兴趣的人,这里是我正在谈论的方法

public bool CheckForNewVersion(out Patch newPatch)
{
    string versionFileContents = this.GetVersionFile();

    List<Patch> patches = this.Deserialize(versionFileContents);

    foreach (Patch patch in patches)
    {
        if (patch.Version > this.CurrentVersion)
        {
            newPatch = patch;
            return true;
        }
    }

    newPatch = null;
    return false;
}
public bool CheckForNewVersion(out-Patch-newPatch)
{
字符串versionFileContents=this.GetVersionFile();
List patches=this.Deserialize(versionFileContents);
foreach(补丁中的补丁)
{
如果(patch.Version>this.CurrentVersion)
{
新补丁=补丁;
返回true;
}
}
newPatch=null;
返回false;
}

您可以将方法的签名更改为如下内容

    public IEnumerable<Patch> GetUpdates(string currentClientVersion)
    {
        var updates = new List<Patch>();

        if (currentClientVersion != LatestVersion)
        {
            updates = GetRequiredUpdates(currentClientVersion);
        }

        return updates;
    }
public IEnumerable GetUpdate(字符串currentClientVersion)
{
var updates=新列表();
如果(currentClientVersion!=最新版本)
{
更新=GetRequiredUpdate(currentClientVersion);
}
返回更新;
}

这将为您提供一个要应用的所有更新的列表,或者如果客户端安装了最新版本,则为空列表。

除非我误解了这个问题,否则我更希望对象封装所需和返回的数据。这将允许您在将来添加任何新功能(因为这是一个API)

//有哪些修补程序可用?
公共类补丁检查结果{
公共补丁检查结果(bool newpatchavailable,List availablePatches){
NewPatchAvailable=NewPatchAvailable;
AvailablePatches=AvailablePatches??新列表();
}
public bool NewPatchAvailable{get;private set;}
公共列表可用匹配{get;private set;}
}
//检查可用修补程序所需的信息
公共类补丁信息{
公共字符串CurrentVersion{get;set;}
}
//API方法
公共PatchCheckOutput GetAvailablePatches(PatchCheckInformation信息);

out很好,event也很好。我对这两个都没有偏好,但我经常使用OnPatchAvailable(Version ver)之类的事件。如果您有多个补丁对象,其中有两个或更多版本与默认版本不同,该怎么办?如果这是一种可能的情况,您可以(a)使用
IList
out参数或类似参数,或者(B)使用需要传递现有列表对象的相同类型的输入参数。(这实际上取决于什么更适合您的代码和内部逻辑)。事件(如MaxOvrdrv所述)或回调委托(类似于事件,但通用性较低)也可以是一个选项。可以禁用,但为什么不使用方法返回列表而不是布尔值。其中列表仅为具有较新版本的列表。@elgonzo当前,该方法返回true,并使用新版本返回out参数。然后另一个对象下载并安装补丁,然后重复整个过程,直到没有新版本可用。我选择了布尔返回值,因为在选择更昂贵的选项之前,我只需要检查返回值是真是假。好吧,但是为什么在代码中有一个foreach循环在补丁列表上迭代呢?显然,CheckForNewVersion的一个调用必须处理多个面片对象,而不仅仅是一个。如果遇到新的修补程序版本,您是否打算中止迭代/处理并丢弃剩余的修补程序对象?我知道这背后的概念,这是有好处的,但这不是我想要的。正如在原始问题的评论中所述,我正在一个接一个地下载补丁,所以我的检查方法在找到下一个更高版本后实际上会返回。如果我返回多个补丁,我会朝你的方向走。
    public IEnumerable<Patch> GetUpdates(string currentClientVersion)
    {
        var updates = new List<Patch>();

        if (currentClientVersion != LatestVersion)
        {
            updates = GetRequiredUpdates(currentClientVersion);
        }

        return updates;
    }
//What patches are available?
public class PatchCheckOutcome {

     public PatchCheckOutcome(bool newPatchAvailble, List<Patch> availablePatches) {
          NewPatchAvailable = newPatchAvailable;
          AvailablePatches = availablePatches ?? New List<Patch>();
     }

     public bool NewPatchAvailable { get; private set; }
     public List<Patch> AvailablePatches { get; private set; }

}

//Information required to check what patches are available
public class PatchCheckInformation {

     public string CurrentVersion { get; set; }
}



//API method
public PatchCheckOutcome GetAvailablePatches(PatchCheckInformation info);