Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Hello,

θέλω να φτιάξω ένα ASP.Net MVC controller που θα κάνει speed limit όταν κατεβάζεις ένα αρχείο. Έχω κάνει το εξής (πρόχειρο) το οποίο δουλεύει:

 

Μια κλάση που διαβάζει με ένα καρφωτό delay

public class ThrottledStream : Stream
{
	...

	public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
	{
		await Task.Delay(1000);
		return await base.ReadAsync(buffer, offset, count, cancellationToken);
	}

	...
}

Και ο controller:

public async Task<ActionResult> ThrottledDownloadAsync(string filename)
{
	var path = this.Server.MapPath("~/uploads/" + filename + ".mp3");

	if (!System.IO.File.Exists(path))
	{
		return this.HttpNotFound();
	}
	else
	{
		await this.WriteThrottled(path);
		return new EmptyResult();
	}
}

private async Task<int> WriteThrottled(string path)
{
	const int bufferSize = 4096, bps = 1024 * 2;

	using (var sourceStream = new Models.ThrottledStream(path, bps))
	{
		this.Response.ClearHeaders();
		this.Response.ClearContent();
		this.Response.ContentType = "application/octet-stream";
		this.Response.AddHeader("Content-Length", sourceStream.Length.ToString());
		this.Response.BufferOutput = false;

		byte[] buffer = new byte[bufferSize];
		int readCount = await sourceStream.ReadAsync(buffer, 0, bufferSize);

		while (readCount > 0)
		{
			await Response.OutputStream.WriteAsync(buffer, 0, readCount);
			readCount = await sourceStream.ReadAsync(buffer, 0, bufferSize);
		}
	}

	return 0;
}


Το ερώτημά μου είναι αν αυτός είναι αποδοτικός τρόπος ή αν κάθε request θα μου μπλοκάρει ένα thread με συνέπεια να τα φτύσει το σύστημα όταν θα έχω πολλά concurrent requests.

 

Επιπλέον ... χρειάζεται να κόψω κάποιο await; Υπάρχει κάποιο που δεν έχει νόημα;

Δημοσ.

H Task.Delay() εχει ενα System.Threading.Timer που καλει το callback μετα από το χρονικο διαστημα.

H Stream.ReadAsync() χρησιμοποιεί I/O completion ports.

Καμια δεν μπλοκάρει, δεν υπάχρει thread που να περιμενει μεχρι να επιστρεψουν.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...