第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

當(dāng)我嘗試使用線程重命名我的文件名并關(guān)閉并刷新 FileStream 時

當(dāng)我嘗試使用線程重命名我的文件名并關(guān)閉并刷新 FileStream 時

C#
明月笑刀無情 2022-12-24 11:01:55
我有大量數(shù)據(jù),我需要每 5 秒制作一次“.txt”文件,然后在新創(chuàng)建的“.txt”文件中寫入下一個數(shù)據(jù),但是當(dāng)我嘗試使用定時器線程時,程序運行正常但是一段時間后,它將通過異常無法訪問已關(guān)閉的文件。請在我的代碼中幫助我,并建議我必須做什么。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貢獻(xiàn)1818條經(jīng)驗 獲得超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);

    }

}

我建議您閱讀以下有關(guān)鎖定語句的文檔


更新

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

其他要記住的事情:

  • 死鎖。

  • 有多少并發(fā)線程值得同時運行。

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


查看完整回答
反對 回復(fù) 2022-12-24
  • 1 回答
  • 0 關(guān)注
  • 109 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號