PDA

View Full Version : حرفه ای: فرستادن درخواستهای مکرر به API



Shahram1974
شنبه 30 اسفند 1399, 19:11 عصر
سلام دوستان عزیز سال نو مبارک باشه

من باید یک درخواست post رو هر 100 میلی ثانیه به یک API بفرستم و در سمت سرور اگر فاصله بین 2 درخواست کمتر از 100 میلی ثانیه باشه همه درخواستها رو حذف می کنه.مشکلی که دارم اینه چطور می تونم بدون اینکه منتظر response بمونم درخواستهامو با فاصله های 100 میلی ثانیه بفرستم ؟ چون بعضا Response بعد از 400 میلی ثانیه میاد.آیا باید از Threadıng استفاده کنم ؟ و هر درخواست رو در یک Thread بزارم ؟

the king
شنبه 30 اسفند 1399, 21:16 عصر
سلام دوستان عزیز سال نو مبارک باشه

من باید یک درخواست post رو هر 100 میلی ثانیه به یک API بفرستم و در سمت سرور اگر فاصله بین 2 درخواست کمتر از 100 میلی ثانیه باشه همه درخواستها رو حذف می کنه.مشکلی که دارم اینه چطور می تونم بدون اینکه منتظر response بمونم درخواستهامو با فاصله های 100 میلی ثانیه بفرستم ؟ چون بعضا Response بعد از 400 میلی ثانیه میاد.آیا باید از Threadıng استفاده کنم ؟ و هر درخواست رو در یک Thread بزارم ؟
فقط یک Thread بسازید که وظیفه اش ارسال درخواست ها با رعایت اون مکث 100 میلی ثانیه باشه، یک صف هم برای درخواست ها بسازید که Thread از اون صف درخواست ها رو بخونه و بفرسته. هر وقت چیزی تو صف نبود هم که میخوابه تا وقتی که درخواستی به صف اضافه بشه.
اول یک کلاس برای داده های یک درخواست بسازید که هر داده ای که در درخواست لازمه داخلش ثبت بشه، هر چیزی که خودتون میدونید لازمه :

public class RequestData
{
public string Data { get; set; }
}

و یک کلاس برای مدیریت ارسال بسازید که برای خودش Thread و صف داره و بشه با یک متد بهش درخواست از نوع RequestData اضافه کرد و با یک متد فعالیت اش رو شروع کنه و با یک متد فعالیت اش تموم بشه و ...
فقط اون بخش Your code for sending requestData رو تکمیل می کنید تا داده داخل requestData به شیوه مناسب POST بشه.

using System.Collections. Generic;
using System.Threading;

public static class RequestSender
{
private static readonly Queue<RequestData> Requests = new Queue<RequestData>( );
private static readonly Semaphore Sem = new Semaphore( 0, int.MaxValue);
private static Thread _thread;
private static bool _killed;

public static void Start( )
{
_killed = false;
_thread = new Thread( ThreadProc);
_thread.Start( );
}

public static void Stop( )
{
_killed = true;
_thread.Abort( );
}

private static void ThreadProc( )
{
do
{
Sem.WaitOne( );
if ( _killed)
{
return;
}
RequestData requestData;
lock ( Requests)
{
requestData = Requests.Dequeue( );
}
/////////
//
// Your code for sending requestData...
//
/////////
if ( _killed)
{
return;
}
Thread.Sleep( 100);
} while ( _killed == false);
}

public static void Send( RequestData request)
{
lock ( Requests)
{
Requests.Enqueue( request);
}
Sem.Release( );
}
}


حالا هر زمان اراده کردید موتورش رو روشن می کنید :

private void button1_Click( object sender, EventArgs e)
{
RequestSender.Start();
}


هر زمان لازم شد متوقف اش می کنید، درخواست های ارسال نشده تو صف می مانند تا وقتی که دوباره Start کنید :

private void button2_Click( object sender, EventArgs e)
{
RequestSender.Stop();
}


و در هر نخی که خواستید می توانید درخواست جدید Send کنید، نگران تداخل یا نرخ ارسال هم نیستید چون اگر از درخواست قبلی کمتر از 100 میلی ثانیه فاصله داشته باشه بصورت خودکار مکث ایجاد میشه :

private void button3_Click( object sender, EventArgs e)
{
var req = new RequestData();
req.Data = "your data";
RequestSender.Send(req);
}

Shahram1974
یک شنبه 01 فروردین 1400, 11:16 صبح
مرسی ممنونم از وقتی که گذاشتید بسیار عالی بود.:قلب: