نوشته شده توسط
taghvajou
سلام
همون طور که دوستمون اشاره کرد، برای اینکه وب ریکوست رو آسینک میشه اجرا کرد که در بک گراند خودش ترد جدایی براش اجرا میکنه.
بخش دوم سوال:
اینکه ترد چه کارهایی نمیشه باهاش کرد، باید اول مشخص کنیم کدوم ترد؟ اگه شما ترد جدید ساختی (یا ورکر بگ گراند)، موقع اجرا دسترسی به یو آی نداره . مثلا با یه ترد جدید نمیتونی یه فرم جدید نمایش بدی. فرم میاد بالا ولی خالیه! وقتی فرم اصلی اجرا میشه میفته تو لوپ و دیگه دسترسی به کنترلها و داده هایی که یوزر وارد کرده نیست.
به صورت کلی داخل ترد میشه متغیر تعریف کرد. اینکه داخل ترد یه استاپ واچ تعریف بشه یا چیزهایی که تو کد نشون دادین و این تیکه کد هیچ ایرادی در ظاهر نداره.
مگر اینکه بخوایم از این ترد به یه ترد دیگه :
اگه قصد دارین شی تعریف یا تغییر کنین که مربوط به ترد دیگه، نمیشه. خطای کراس ترد میده! مگر اینکه ترد یو آیی رو اینوک کنیم و اجرا رو به دست بگیره و ... یا
یا اگر قرار یه مقداری رو از داخل فرم بخونی تو یه متغیر نگه دار و داخل ترد جدیدش از مقدار متغیر استفاده کن.
اگه میشه کاملتر بذارین کد رو تا ببینیم چی به چیه
ممنون که وقت میزارین
کد من شبیه این هست ایا این کد مشکلی نداره
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 در داخل ترد استفاده کرد
فرق تسک با ترد چیه
ببخشید اگر زیاد شد