Jump to content

FileStream write


pbreda

Recommended Posts

Boas, tenho um problema com o filestream tento usar este código

PackageManager.ClientPack.Add((int)Packages.UPClientPackages.RECEIVE_UPDATE, (data) =>
{
	byte[] inData = PackageManager.ReadBytesPackage(data.Length - 4, data);

	fs.Write(inData, 0, inData.Length);
    Thread.Sleep(10);
    bytesRecived += inData.Length;
    fs.Flush();
    OnUpdateDownload?.Invoke(bytesRecived, fileInfo.FileLenght);
});

e a app pára a escrita a não ser que use o Thread.sleep(10) não estou a perceber pq...alguém me consegue explicar?

Qualquer coisa esfrega a lampada!!!Visite Banco de Software e desfrute do software disponível xD

Link to comment
Share on other sites

senão parar o thread o ficheiro fica interrompido....pelo que me a percebi não termina a escrita a tempo do próximo bloco ser escrito...não consigo encontrar outra solução pra alem dessa...já tentei com BeginWrite e BeginRead mas não sei pq, não funciona corretamente. Também tentei com async e o await e nada...fica na mesma. 

 

ClientServer.Start(serverAddr, port, () =>
            {
                PackageManager.ClientPack.Add((int)Packages.UPClientPackages.CONNECTED_OK, (data) =>
                {
                    OnClientConnected?.Invoke();

                    ClientServer.SendData(PackageManager.WriteStringPackage((int)Packages.UPServerPackages.CHECK_UPDATE, JsonSerializer.SerializeToString(Converters.GetApplicationInfoFromAssembly(app)))); 
                });

                PackageManager.ClientPack.Add((int)Packages.UPClientPackages.UPDATE_NEED, (data) =>
                {
                    OnCheckForUpdateComplete?.Invoke(Convert.ToBoolean(PackageManager.ReadShortPackage(data)));
                });

                PackageManager.ClientPack.Add((int)Packages.UPClientPackages.RECEIVE_FILE_INFO, (data) =>
                {
                    fileInfo = JsonDeserializer.DeserializeFromString(PackageManager.ReadStringPackage(data), typeof(FileInfoModel));

                    fs = File.Open(fileInfo.FileName, FileMode.OpenOrCreate);

                    ClientServer.SendData(PackageManager.WriteShortPackage((int)Packages.UPServerPackages.DOWNLOAD_UPDATE, 1));
                });

                PackageManager.ClientPack.Add((int)Packages.UPClientPackages.RECEIVE_UPDATE, (data) =>
                {
                    byte[] inData = PackageManager.ReadBytesPackage(data.Length - 4, data);

                    fs.Write(inData, 0, inData.Length);
                    Thread.Sleep(10);
                    bytesRecived += inData.Length;
                    fs.Flush();
                    OnUpdateDownload?.Invoke(bytesRecived, fileInfo.FileLenght);
                });

            });

Este código é da função completa....talvez dê mais sentido ao problema em questão.

Qualquer coisa esfrega a lampada!!!Visite Banco de Software e desfrute do software disponível xD

Link to comment
Share on other sites

Tipicamente esse tipo de funcionalidade costuma ser lançada numa thread própria para não bloquear a principal.
Podes ir recebendo a informação e colecionando a mesma e mandares escrever o ficheiro apenas quando já tens a informação toda completa do teu lado.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.