亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我嘗試使用線程重命名我的文件名并關閉并刷新 FileStream 時

當我嘗試使用線程重命名我的文件名并關閉并刷新 FileStream 時

C#
明月笑刀無情 2022-12-24 11:01:55
我有大量數據,我需要每 5 秒制作一次“.txt”文件,然后在新創建的“.txt”文件中寫入下一個數據,但是當我嘗試使用定時器線程時,程序運行正常但是一段時間后,它將通過異常無法訪問已關閉的文件。請在我的代碼中幫助我,并建議我必須做什么。public class Program    {        public static void Main(string[] args)        {            Service s = new Service();            s.init();        }    }    class Service    {        FileStream fs = null;        int filecount = 0;        long a = 1000000000000000;      // int j = 0;        public void  init()        {            initialiseFile(filecount);            timer();            WriteINFile();        }        private void initialiseFile( int filecount)        {                fs = File.Create("C:\\Users\\yogesh.ghonate\\source\\repos\\ConsoleApp3\\ConsoleApp3\\NewFolder1\\Index_" + filecount + ".txt");                }        private void WriteINFile()        {            string sen = " write in file ";                for (int i = 0; i < a; i++)                {                    Byte[] title = new UTF8Encoding(true).GetBytes(sen);                    fs.Write(title, 0, title.Length);                }        }        public void timer()        {            System.Timers.Timer th = new System.Timers.Timer();            th.Interval = 5000;            th.Elapsed += new ElapsedEventHandler(run);            th.Start();                     run(th, null);        }        public void run(object state, ElapsedEventArgs e)        {            Commitzfile();        }        private void Commitzfile()        {            //Stopwatch stopwatch = new Stopwatch();            //stopwatch.Start();            fs.Flush();            fs.Close();            // fs.Dispose();            //stopwatch.Stop();            filecount++;            initialiseFile(filecount);        }    }
查看完整描述

1 回答

?
弒天下

TA貢獻1818條經驗 獲得超8個贊

最直接的解決方案是添加lock到您的代碼中。這將防止任何競爭條件,也會使您的代碼變慢一點,因為它會在資源正在使用時阻塞線程。


你可以像這樣使用它:


// add new lock object

object lockObject = new object();

FileStream fs = null;

int filecount = 0;

long a = 1000000000000000;



private void WriteINFile()

{

    string sen = " write in file ";


    for (int i = 0; i < a; i++)

    {

        Byte[] title = new UTF8Encoding(true).GetBytes(sen);

        lock (lockObject)

        {

            fs.Write(title, 0, title.Length);

        }

    }

}



private void Commitzfile()

{

    lock(lockObject)

    {

        fs.Flush();

        fs.Close();

        filecount++;

        initialiseFile(filecount);

    }

}

我建議您閱讀以下有關鎖定語句的文檔


更新

在并發編程中有許多問題需要考慮。其中之一是資源管理。通常該問題與Dining philosophers problem一起出現。主要問題發生在嘗試由多個進程/線程使用資源時,但該資源一次只能由一個進程/線程使用。在您的情況下,它是 FileStream,因為一個線程一直試圖寫入它,而在另一個線程上它已關閉并已更改。您可以看到,在某些情況下,可能會發生一個關閉流而另一個仍在嘗試同時寫入的情況。要克服這個問題,您需要確保資源一次只能由一個線程訪問。執行此操作的一種工具是鎖定語句。

其他要記住的事情:

  • 死鎖。

  • 有多少并發線程值得同時運行。

希望這個簡短的總結能有所幫助。如果您需要更多信息,請隨時提出新問題(或查找是否已有問題)。


查看完整回答
反對 回復 2022-12-24
  • 1 回答
  • 0 關注
  • 92 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號