Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在程序运行之间维护一个变量值_C#_.net_Windows Applications_Stateful - Fatal编程技术网

C# 在程序运行之间维护一个变量值

C# 在程序运行之间维护一个变量值,c#,.net,windows-applications,stateful,C#,.net,Windows Applications,Stateful,我有一个简单的c#控制台应用程序,计划每5分钟运行一次。程序的每次调用都需要最后一次运行的输出 我现在正在做的是使用一个文本文件并将结果存储在其中。下次运行时,它会打开文本文件,并知道上一次运行的输出 有没有其他方法不需要这样的文本文件? 例如维护会话变量等?您必须将数据保存在某个地方。控制台应用程序没有会话变量(甚至没有会话)。你可能是指环境变量。如果将其存储在环境变量中,则程序必须从同一环境(即从同一控制台窗口)运行。如果机器崩溃,环境变量将丢失。你最好带个文件 如果每5分钟运行一次,您能让

我有一个简单的c#控制台应用程序,计划每5分钟运行一次。程序的每次调用都需要最后一次运行的输出

我现在正在做的是使用一个文本文件并将结果存储在其中。下次运行时,它会打开文本文件,并知道上一次运行的输出

有没有其他方法不需要这样的文本文件?
例如维护会话变量等?

您必须将数据保存在某个地方。控制台应用程序没有会话变量(甚至没有会话)。你可能是指环境变量。如果将其存储在环境变量中,则程序必须从同一环境(即从同一控制台窗口)运行。如果机器崩溃,环境变量将丢失。你最好带个文件

如果每5分钟运行一次,您能让程序休眠到需要再次运行吗?然后,数据将在内存中可用。如果机器崩溃,这仍然是一个问题,因此您可能仍然需要保留一个文件作为备份

如果你不想让用户看到一个文件,并且它没有太多的数据(尽管几个K字节可能是可行的),正如@Quintin Robinson所建议的,你可以使用注册表。只需确保您正在写入一个符合逻辑且具有正确权限的区域

如果你不想让用户看到文件中的内容,你可以将内容置乱,使其无法阅读。如果使用加密,则需要本地密钥进行解密,以便熟练或坚定的攻击者仍然能够获取该文件。压缩数据并称之为好数据可能更好

如果您不希望用户能够轻松地更改文件中的内容,可以将校验和、哈希或HMAC与数据一起存储。您必须在本地验证它,这意味着它可能会受到攻击,但应该可以阻止临时用户进行比特攻击

当然,您可以结合注册表存储、加扰和校验和,这取决于您的需要和顾虑

我曾考虑提及PStor和CryptProtectData/CryptUnprotectData,但后来我意识到它们的安全性是基于用户的,因此在这里没有帮助


如果机器连接到Internet,你可以考虑云存储,虽然我不知道这是否适合你的应用程序。

你可以使用设置文件。每次程序关闭时,只需向项目中添加一个设置文件并保存要存储的值。当程序启动时,让它检查设置文件中的值。

首先使用解决方案强制应用程序同时只运行一个实例

然后创建一个可序列化类来保存应用程序状态,并创建一个帮助器类来加载并将其保存到文件中。请参见示例:

[XmlRoot("RegexTesterPersistantSettings")]
[Serializable]
public class State
{
    public State()
    {
        this.Pattern = string.Empty;
        this.TestString = string.Empty;
        this.Options = 0;
    }
    [XmlElement("Pattern")]
    public string Pattern{get;set;}

    [XmlElement("TestString")]
    public string TestString{get;set;}

    [XmlElement("Options")]
    public int Options { get; set; }

    public override int GetHashCode()
    {
        return this.Options.GetHashCode() ^ this.Pattern.GetHashCode() ^ this.TestString.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        State anotherState = obj as State;
        if (anotherState == null)
        {
            return false;
        }

        return this.Equals(anotherState);
    }

    public bool Equals(State anotherState)
    {
        return this.GetHashCode() == anotherState.GetHashCode();
    }

    public static bool operator ==(State a, State b)
    {
        // If both are null, or both are same instance, return true.
        if (System.Object.ReferenceEquals(a, b))
        {
            return true;
        }

        // If one is null, but not both, return false.
        if (((object)a == null) || ((object)b == null))
        {
            return false;
        }
        return a.Equals(b);
    }

    public static bool operator !=(State a, State b)
    {
        return !a.Equals(b);
    }

}

public class PersistantHelper
{
    private string filename;
    private State _state;

    public PersistantHelper(string xmlFilename = "RegexTesterSettings")
    {
        string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        this.filename  = Path.Combine(appDataPath, xmlFilename);
    }

    private XmlSerializer _serializer;
    private XmlSerializer Serializer
    {
        get
        {
            if (this._serializer == null)
            {
                this._serializer = new XmlSerializer(typeof(State));
            }
            return this._serializer;
        }
    }

    private void SaveState(State state)
    {
        if (File.Exists(this.filename))
        {
            File.Delete(this.filename);
        }
        var stream  = new FileStream(this.filename,  FileMode.OpenOrCreate, FileAccess.Write,FileShare.None);
        this.Serializer.Serialize(stream, state);
        stream.Close();
    }

    public State State
    {
        get
        {
            if (this._state == null)
            {
                this._state = this.GetState();
            }
            return this._state;
        }
        set 
        {
            if (this.State != value)
            {
                this.SaveState(value);
            }
        }
    }

    private State dummyState = new State() { Options = 0 };
    private State GetState()
    {
        if (!File.Exists(this.filename))
        {
            return this.dummyState;
        }
        Stream stream = null;
        try
        {
            stream = new FileStream(this.filename, FileMode.Open, FileAccess.Read,FileShare.None);
            var o = this.Serializer.Deserialize(stream);
            return (State)o;
        }
        catch
        {
            return this.dummyState;
        }
        finally
        {
            if (stream != null)
            {
                stream.Close();
            }
        }

    }
}
然后从应用程序加载并保存状态:

    private PersistantHelper persistantHelper;
    public frmTester()
    {
        InitializeComponent();
        this.persistantHelper = new PersistantHelper();
        .
        .
        .
    }

private void LoadPersistantData()
{
    State state = this.persistantHelper.State;
    this.txtPattern.Text = state.Pattern;
    this.txtTest.Text = state.TestString;
    foreach (Control c in this.pnlOptions.Controls)
    {
        if (c is CheckBox)
        {
            var chk = c as CheckBox;
            int tag = int.Parse(c.Tag.ToString());
            chk.Checked = (state.Options & tag) == tag;
        }
    }
}


private void SavePersistantData()
{
    this.persistantHelper.State = new State()
    {
        Options = (int)this.GetOptions(),
        Pattern = txtPattern.Text,
        TestString = txtTest.Text
    };
}       

你可以使用很多方法;数据库、注册表、任意文件存储等。是否有理由偏离文本文件存储机制?我使用@QuintinRobinson,这将有助于理解为什么您认为文件不是最佳解决方案。这是因为我不希望用户看到我的程序正在创建一个文本文件。休眠程序似乎是个好主意。@QuintinRobinson,大多数企业解决方案都使用pid锁文件来禁止并发执行。为什么你认为IO文件不好?@Akshay。看看我的答案,这个文件将在appdata文件夹中创建。有一个放置应用程序数据的好地方。你也可以加密文件。我想听听软件顾问的意见。如此彻底的回答:并发应用程序执行如何?@pylover我给出了一个简单的解决方案,可以满足他的要求。他从来没有说过需要并发执行。@user1739957您的解决方案也很棒!我不知道为什么这是公认的答案。这太过分了。最初的问题也没有提到并发进程。如果不考虑并发,就没有保证,它可能会失败。