PDA

View Full Version : حرفه ای: درخواست WebRequest در thread



a.golzar66
شنبه 09 فروردین 1399, 14:35 عصر
سلام دوستان
یک سوال دارم که خیلی باهاش ور رفتم ولی به جوابی نرسیدم و اون اینه که ایا میشه داخل یک ترد از دستور WebRequest برای صدا زدن یک api و گرفتن اطلاعات از آن استفاده کرد؟
لطفا سریع راهنمایی کنید
تشکر

the king
شنبه 09 فروردین 1399, 16:20 عصر
سلام دوستان
یک سوال دارم که خیلی باهاش ور رفتم ولی به جوابی نرسیدم و اون اینه که ایا میشه داخل یک ترد از دستور WebRequest برای صدا زدن یک api و گرفتن اطلاعات از آن استفاده کرد؟
لطفا سریع راهنمایی کنید
تشکر
بله. لزومی نداره که حتما در Thread اصلی که فرم رو مدیریت می کنه اجرا بشه، می توانید به تعداد مورد نیازتون Thread بسازید و درخواست ها رو در Thread مجزا ایجاد کنید.
البته اگر هدف تون اینه که دریافت پاسخ در زمینه انجام بشه و در طی مدت زمانی که منتظر دریافت پاسخ ئه بتوانید کارهای دیگری رو انجام بدید، قابلیت هایی مثل HttpWebRequest.BeginGetResponse وجود داره و لزوما نیازی نیست که خودتون Thread مجزا بسازید.

a.golzar66
شنبه 09 فروردین 1399, 17:06 عصر
بله. لزومی نداره که حتما در Thread اصلی که فرم رو مدیریت می کنه اجرا بشه، می توانید به تعداد مورد نیازتون Thread بسازید و درخواست ها رو در Thread مجزا ایجاد کنید.
البته اگر هدف تون اینه که دریافت پاسخ در زمینه انجام بشه و در طی مدت زمانی که منتظر دریافت پاسخ ئه بتوانید کارهای دیگری رو انجام بدید، قابلیت هایی مثل HttpWebRequest.BeginGetResponse وجود داره و لزوما نیازی نیست که خودتون Thread مجزا بسازید.

ممنون دوست عزیز- ببخشید اگر سوالات من یه مقدار مبتدی هست
ایا میشه تو ترد متغیر تعریف کرد مثلا

long sumEntered = 0; Province thisProvince = null;
var stopwatch = new Stopwatch();
int sumModemReset = 0;
Category cat = null;
int numReadCity = 0;
int numReadCat = 0;
var allCity = "";
var allCat = "";

و اینکه چه کارهایی را نمیشه در thread انجام داد-چون من فقط یک ترد دارم ولی وقتی اجرا میشه بعد از چند خط که اجرا کرد و به کد زیر رسید یکدفعه از ترد میاد بیرون و خط بعد myThread.start() را اجرا میکنه

taghvajou
شنبه 09 فروردین 1399, 19:16 عصر
سلام

همون طور که دوستمون اشاره کرد، برای اینکه وب ریکوست رو آسینک میشه اجرا کرد که در بک گراند خودش ترد جدایی براش اجرا میکنه.

بخش دوم سوال:
اینکه ترد چه کارهایی نمیشه باهاش کرد، باید اول مشخص کنیم کدوم ترد؟ اگه شما ترد جدید ساختی (یا ورکر بگ گراند)، موقع اجرا دسترسی به یو آی نداره . مثلا با یه ترد جدید نمیتونی یه فرم جدید نمایش بدی. فرم میاد بالا ولی خالیه! وقتی فرم اصلی اجرا میشه میفته تو لوپ و دیگه دسترسی به کنترلها و داده هایی که یوزر وارد کرده نیست.

به صورت کلی داخل ترد میشه متغیر تعریف کرد. اینکه داخل ترد یه استاپ واچ تعریف بشه یا چیزهایی که تو کد نشون دادین و این تیکه کد هیچ ایرادی در ظاهر نداره.
مگر اینکه بخوایم از این ترد به یه ترد دیگه :
اگه قصد دارین شی تعریف یا تغییر کنین که مربوط به ترد دیگه، نمیشه. خطای کراس ترد میده! مگر اینکه ترد یو آیی رو اینوک کنیم و اجرا رو به دست بگیره و ... یا
یا اگر قرار یه مقداری رو از داخل فرم بخونی تو یه متغیر نگه دار و داخل ترد جدیدش از مقدار متغیر استفاده کن.

اگه میشه کاملتر بذارین کد رو تا ببینیم چی به چیه

a.golzar66
یک شنبه 10 فروردین 1399, 08:51 صبح
ممنون دوست عزیز الان میزارم

a.golzar66
یک شنبه 10 فروردین 1399, 12:04 عصر
سلام

همون طور که دوستمون اشاره کرد، برای اینکه وب ریکوست رو آسینک میشه اجرا کرد که در بک گراند خودش ترد جدایی براش اجرا میکنه.

بخش دوم سوال:
اینکه ترد چه کارهایی نمیشه باهاش کرد، باید اول مشخص کنیم کدوم ترد؟ اگه شما ترد جدید ساختی (یا ورکر بگ گراند)، موقع اجرا دسترسی به یو آی نداره . مثلا با یه ترد جدید نمیتونی یه فرم جدید نمایش بدی. فرم میاد بالا ولی خالیه! وقتی فرم اصلی اجرا میشه میفته تو لوپ و دیگه دسترسی به کنترلها و داده هایی که یوزر وارد کرده نیست.

به صورت کلی داخل ترد میشه متغیر تعریف کرد. اینکه داخل ترد یه استاپ واچ تعریف بشه یا چیزهایی که تو کد نشون دادین و این تیکه کد هیچ ایرادی در ظاهر نداره.
مگر اینکه بخوایم از این ترد به یه ترد دیگه :
اگه قصد دارین شی تعریف یا تغییر کنین که مربوط به ترد دیگه، نمیشه. خطای کراس ترد میده! مگر اینکه ترد یو آیی رو اینوک کنیم و اجرا رو به دست بگیره و ... یا
یا اگر قرار یه مقداری رو از داخل فرم بخونی تو یه متغیر نگه دار و داخل ترد جدیدش از مقدار متغیر استفاده کن.

اگه میشه کاملتر بذارین کد رو تا ببینیم چی به چیه


ممنون که وقت میزارین:قلب:
کد من شبیه این هست ایا این کد مشکلی نداره




public static class ThreadManager
{
public static Thread MyThread { get; set; }
public static int IsCancel = 0;
public static string ErroreMessage { get; set; }
public static GetFromApiDtos GetFromApi(List<string> city, List<int> category)
{
long sumEntered = 0;
Province thisProvince = null;
var stopwatch = new Stopwatch();
int sumModemReset = 0;
Category cat = null;
int numReadCity = 0;
int numReadCat = 0;
var allCity = "";
var allCat = "";
stopwatch.Start();



MyThread = new Thread(async () =>
{

#region MyCode
try
{

List<string> lstProduckToken = null;
using (var db = new ApiDB())
{
if (category != null && category.Count > 0)
{
var catId = category[numReadCat];
cat = db.Categories.Find(catId);
}


var cityname = city[numReadCity];
thisProvince =await db.Provinces.FirstOrDefaultAsync(x => x.EnName == cityname);


lstProduckToken =await db.Products.Where(x => x.City == thisProvince.FaName).Select(x => x.Token)
.ToListAsync();
}



}
var request = WebRequest.Create($"https://api/mysite/]}" );


request.Method = "GET";
request.ContentType = "application/json; charset=utf-8";


Date_Time.Date Dates = new Date();
Date_Time.Time Times = new Time();

var response = (HttpWebResponse)await request.GetResponseAsync();
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
var responseString = await streamReader.ReadToEndAsync();
JObject json = JObject.Parse(responseString);


using (var db = new ApiDB())
{
var countFinded = json["prod"].Count();

if (json["prod"].HasValues)
.
.
.
.
.

{

در اخر هم ترد را استارت کردم ومقدار زیر را برای تابع استاتیک بالا که کدها داخل ان نوشته شده (GetFromApi) برمیگردانم


MyThread.Start(); MyThread.Join();


var data = new GetFromApiDtos()
{
City = allCity,
ElapsedTime = stopwatch.Elapsed.TotalSeconds,
SumEntered = sumEntered,
SumModemReset = sumModemReset,
ThisCat = allCat,
IsCancel = IsCancel,
Errore = ErroreMessage
};
return data;
باعرض پوزش من برنامه asp.net mvc هست ولی گفتم شاید موضوع مورد بحث زیاد فرقی نداشته باشه که در سی شارپ باشه یا asp
ببینید کد من منتظر نمیشه که ترد کارش تموم بشه بعد بیاد مقدار رو برگردونه بلکه همون اول همزمان با اجرای ترد میاد مقدار را برمیگرداند و بعد میره ترد را کامل اجرا میکنه؟؟؟
یه سوال هم اینکه ایا در ترد میتونم مقداری را برگردانم

ایا میشه از دستور goto در داخل ترد استفاده کرد
فرق تسک با ترد چیه

ببخشید اگر زیاد شد

a.golzar66
یک شنبه 10 فروردین 1399, 12:22 عصر
یکی از مشکلات مهم من اینه که وقتی به این خط اول میرسه منتظر رسپانس نمیشه و میره دستورات بعد از ترد را اجرا میکنه و بعد دوباره وقتی رسپانس جوابش رسید دوباره میره ادامه کار ترد را انجام میده:ناراحت:


var response = (HttpWebResponse)await request.GetResponseAsync(); using (var streamReader = new StreamReader(response.GetResponseStream()))
{
var responseString = await streamReader.ReadToEndAsync();
JObject json = JObject.Parse(responseString);
}

a.golzar66
پنج شنبه 14 فروردین 1399, 12:10 عصر
دوستان چرا کسی جواب نمیده