簡體   English   中英

在多個運行的 exe 之間共享靜態變量?

[英]Static variable shared among multiple running exe?

我創建了一個帶有靜態變量(運行時生成的隨機數)的應用程序。 將.exe復制到三個文件夾並運行它。 靜態值似乎在所有三個中共享(相同)。

這是預期的嗎?

我不認為在這種情況下內存是共享的,除非你無意中這樣做了。

然而,new Radom() 相當於說 new Random(DateTime.Now.Millisecond)。 如果你在同一毫秒內運行這 3 個程序(相信我這不僅是可能的,但如果通過代碼來做的話),或者如果你硬編碼了新的隨機(每次都是相同的 int),你的隨機滾動將是相同的如果您在同一范圍內滾動,則所有程序。 0-5 喜歡死什么的。

是的,這是意料之中的。 靜態變量第一次會從“數字生成器”中取值,然后當這個變量有值時它不會在下次從生成器中取值,它會返回其中存儲的值。 所以最好使用靜態方法而不是變量來生成新值。

注意:因為不是多個運行的 exe

假設我們有一個具有靜態變量和靜態方法的類:

 public class StaticTest
        {
            static public int RandomNumber=GenerateRandomNumber();
            static public int GenerateRandomNumber()
            {
                Random rnd = new Random();
                int temp = rnd.Next();
                return temp;
            }
        }

您可以通過從另一個類調用它來測試它並查看輸出:

    int TempVariable1 =StaticTest.RandomNumber;

    int TempVariable2= StaticTest.RandomNumber;

    int TempMethod1 = StaticTest.GenerateRandomNumber();

    int TempMethod2 = StaticTest.GenerateRandomNumber();

    System.Console.WriteLine("TempVariable1 = {0}", TempVariable1);
    System.Console.WriteLine("TempVariable2 = {0}", TempVariable2);
    System.Console.WriteLine("TempMethod1 = {0}", TempMethod1);
    System.Console.WriteLine("TempMethod2 = {0}", TempMethod2);

結果如下:

        TempVariable1   1936885472  int
        TempVariable2   1936885472  int
        TempMethod1     1887921393  int
        TempMethod2     2129299766  int

我認為隨機數生成器生成相同的數字。 這就是我獲得相同價值的原因。 下面是我做的代碼示例和我收到的郵件。 我每周都有工作,但這個數字整周都在重復。 :(

重現步驟:

  1. 在發布模式下構建以下代碼。

  2. 復制到3個文件夾bin1、bin2、bin3

  3. 為三個解決方案創建三個任務調度程序作業。

  4. 一起選擇三個任務作業,一起運行。

使用系統;

使用 System.Collections.Generic;

使用 System.IO;

使用 System.Linq;

使用 System.Net.Mail;

使用系統文本;

使用系統線程;

命名空間 XXX.HistoryExtractor { 公共類測試 { public static String RandomNum1;

    /// <summary>
    /// Start method for Job
    /// </summary>
    /// <param name="args"></param>
    public static void Main(string[] args)
    {

        RandomNum1 = new Random().Next(9999).ToString() + " ";
        MailHandler2 mh = new MailHandler2();
        mh.SendJobStartUpdate();
    }

}

public class MailHandler2
{
    String RandomNum;

    public MailHandler2()
    {
        //Thread.Sleep(1000);
        RandomNum = new Random().Next(9999).ToString() + " ";
    }

    public void SendJobStartUpdate()
    {
        try
        {

            var mail = new MailMessage();
            mail.To.Add("lijo.john@urmail.com");

            mail.Subject = "Job  Started " + RandomNum + "  -  " + DateTime.Now;
            mail.Body = "<br/>Job  Started...";
            mail.IsBodyHtml = true;

            using (var smtp = new SmtpClient())
            {
                try
                {
                    smtp.Send(mail);
                }
                catch (Exception c)
                {
                    throw c;
                }
            }

        }
        catch (FormatException eF)
        {

        }

    }

}

}

查看我收到的一組郵件,隨機 nuber 被復制。

從主題收到的大小類別
noreply@mailserver.com 工作開始6887 - 1/22/2020 12:42:55 AM 11:13 41 KB
noreply@mailserver.com 工作開始6887 - 1/22/2020 12:42:55 AM 11:13 40 KB
noreply@mailserver.com 工作開始 4936 - 1/22/2020 12:42:55 AM 11:13 41 KB

=====================

從主題收到的大小類別
noreply@mailserver.com 工作開始7953 - 1/22/2020 12:41:16 AM 11:11 41 KB
noreply@mailserver.com 工作開始 6001 - 1/22/2020 12:41:16 AM 11:11 41 KB
noreply@mailserver.com 工作開始7953 - 1/22/2020 12:41:16 AM 11:11 41 KB

=============================== 來自主題收到的大小類別
noreply@mailserver.com 工作開始時間 1420 - 1/22/2020 12:41:08 AM 11:11 41 KB
noreply@mailserver.com 工作開始5280 - 1/22/2020 12:41:05 AM 11:11 41 KB
noreply@mailserver.com 工作開始5280 - 1/22/2020 12:41:05 AM 11:11 41 KB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM