توقف AsyncTask و فراخوانی یک متد از Class Library مرجع

بپرسید
  • cs-beginner cs-beginner
  • 90 ماه قبل
  • 24 ماه قبل
  • 206 نمایش

0

{{ digitTrunc(content.likes) }}

سلام

ممنون میشم کمکم کنید. من تازه سی شارپ رو شروع کردم. دارم یک چت بات اینستا مینویسم. یه کوچولو مغزم هنگ کرده سه شبانه روز مقاله و کتاب خوندم به نتیجه نرسیدم.

من یه کلاس توی کلاس لایبری جدا تعریف کردم به اسم فرضی AddressDialog.cs که توی فضای نام TradeBot.BotAssets قرار داره که توسط کنترلی در فضای نام مرجع TradeBot زمانی که کاربر بخواد آدرس بده فراخوانی میشه. اما از اونجایی که واقعی بودن آدرس و کد پستی توسط گوگل مپ چک میشه تا زمانی که Context.Done آدرس خروجی نداشته باشه اجازه ادامه دادن نمیده. این مسئله خوبه اما از اونجایی که ممکنه کاربر منصرف بشه (کد برنامه جوری هستش که History کاربر رو نگه میداره) تا زمانی که با آیدی جدید پیام نده بهش اجازه انجام هیچ کاری نمیده.

میشه شما اساتید گرامی کمک کنید من بتونم یه کلمه کلیدی مثل Cancel تعریف کنم که وقتی کاربر Cancel رو تایپ کرد Task متوقف بشه و یک کلاس Task دیگه از فضای نام مرجع TradeBot به اسم AfterChangeMyMind که توی کلاس لایبری RootDialog قرار داره رو صدا کنم؟

سلام
ممنون میشم کمکم کنید. من تازه سی شارپ رو شروع کردم. دارم یک چت بات اینستا مینویسم. یه کوچولو مغزم هنگ کرده سه شبانه روز مقاله و کتاب خوندم به نتیجه نرسیدم. 
من یه کلاس توی کلاس لایبری جدا تعریف کردم به اسم فرضی AddressDialog.cs که  توی فضای نام TradeBot.BotAssets قرار داره که توسط کنترلی در فضای نام مرجع TradeBot زمانی که کاربر بخواد آدرس بده فراخوانی میشه. اما از اونجایی که واقعی بودن آدرس و کد پستی توسط گوگل مپ چک میشه تا زمانی که Context.Done آدرس خروجی نداشته باشه اجازه ادامه دادن نمیده. این مسئله خوبه اما از اونجایی که ممکنه کاربر منصرف بشه  (کد برنامه جوری هستش که History کاربر رو نگه میداره) تا زمانی که با آیدی جدید پیام نده بهش اجازه انجام هیچ کاری نمیده. 
میشه شما اساتید گرامی کمک کنید من بتونم یه کلمه کلیدی مثل Cancel تعریف کنم که وقتی کاربر Cancel رو تایپ کرد Task متوقف بشه و یک کلاس Task دیگه از فضای نام مرجع TradeBot به اسم AfterChangeMyMind که توی کلاس لایبری RootDialog قرار داره رو صدا کنم؟
||http://tosinso.com/files/get/419bb7fd-7fe9-454a-af3c-cee58a68910e||||http://tosinso.com/files/get/c9fa95d9-5157-4a12-ab67-07208b20ed52||
اینم کدهای کلاس AddressDialog


<c#>
namespace TradeBot.BotAssets.Dialogs
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Extensions;
    using Microsoft.Bot.Builder.Dialogs;
    using Microsoft.Bot.Connector;
    using Properties;
    using TradeBot.Services;

    [Serializable]
    public class AddressDialog : IDialog<string>
    {
        private readonly string prompt;
        private readonly ILocationService locationService;

        private string currentAddress;

        public AddressDialog(string prompt, ILocationService locationService)
        {
            this.prompt = prompt;
            this.locationService = locationService;
        }

        public async Task StartAsync(IDialogContext context)
        {
            await context.PostAsync(this.prompt);
            context.Wait(this.MessageReceivedAsync);
        }

        public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
        {
            var message = await result;

            var addresses = await this.locationService.ParseAddressAsync(message.Text);
            if (addresses.Count() == 0)
            {

                await context.PostAsync(Resources.AddressDialog_EnterAddressAgain);
                context.Wait(this.MessageReceivedAsync);
            }
            else if (addresses.Count() == 1)
            {
                this.currentAddress = addresses.First();
                PromptDialog.Choice(context, this.AfterAddressChoice, new[] { Resources.AddressDialog_Confirm, Resources.AddressDialog_Edit }, this.currentAddress);
            }
            else
            {
                var reply = context.MakeMessage();
                reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;

                foreach (var address in addresses)
                {
                    reply.AddHeroCard(Resources.AddressDialog_DidYouMean, address, new[] { new KeyValuePair<string, string>(Resources.AddressDialog_UseThisAddress, address) });
                }

                await context.PostAsync(reply);
                context.Wait(this.MessageReceivedAsync);
            }
        }

        private async Task AfterAddressChoice(IDialogContext context, IAwaitable<string> result)
        {
            try
            {
                var choice = await result;

                if (choice == Resources.AddressDialog_Edit)
                {
                    await this.StartAsync(context);
                }
                else
                {
                    context.Done(this.currentAddress);
                }
            }
            catch (TooManyAttemptsException)
            {
         <>       throw;
            }
        }
    }
}
<c#>
سلام
ممنون میشم کمکم کنید. من تازه سی شارپ رو شروع کردم. دارم یک چت بات اینستا مینویسم. یه کوچولو مغزم هنگ کرده سه شبانه روز مقاله و کتاب خوندم به نتیجه نرسیدم. 
من یه کلاس توی کلاس لایبری جدا تعریف کردم به اسم فرضی AddressDialog.cs که  توی فضای نام TradeBot.BotAssets قرار داره که توسط کنترلی در فضای نام مرجع TradeBot زمانی که کاربر بخواد آدرس بده فراخوانی میشه. اما از اونجایی که واقعی بودن آدرس و کد پستی توسط گوگل مپ چک میشه تا زمانی که Context.Done آدرس خروجی نداشته باشه اجازه ادامه دادن نمیده. این مسئله خوبه اما از اونجایی که ممکنه کاربر منصرف بشه  (کد برنامه جوری هستش که History کاربر رو نگه میداره) تا زمانی که با آیدی جدید پیام نده بهش اجازه انجام هیچ کاری نمیده. 
میشه شما اساتید گرامی کمک کنید من بتونم یه کلمه کلیدی مثل Cancel تعریف کنم که وقتی کاربر Cancel رو تایپ کرد Task متوقف بشه و یک کلاس Task دیگه از فضای نام مرجع TradeBot به اسم AfterChangeMyMind که توی کلاس لایبری RootDialog قرار داره رو صدا کنم؟
||http://tosinso.com/files/get/419bb7fd-7fe9-454a-af3c-cee58a68910e||||http://tosinso.com/files/get/c9fa95d9-5157-4a12-ab67-07208b20ed52||
اینم کدهای کلاس AddressDialog


<c#>
namespace TradeBot.BotAssets.Dialogs
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Extensions;
    using Microsoft.Bot.Builder.Dialogs;
    using Microsoft.Bot.Connector;
    using Properties;
    using TradeBot.Services;

    [Serializable]
    public class AddressDialog : IDialog<string>
    {
        private readonly string prompt;
        private readonly ILocationService locationService;

        private string currentAddress;

        public AddressDialog(string prompt, ILocationService locationService)
        {
            this.prompt = prompt;
            this.locationService = locationService;
        }

        public async Task StartAsync(IDialogContext context)
        {
            await context.PostAsync(this.prompt);
            context.Wait(this.MessageReceivedAsync);
        }

        public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
        {
            var message = await result;

            var addresses = await this.locationService.ParseAddressAsync(message.Text);
            if (addresses.Count() == 0)
            {

                await context.PostAsync(Resources.AddressDialog_EnterAddressAgain);
                context.Wait(this.MessageReceivedAsync);
            }
            else if (addresses.Count() == 1)
            {
                this.currentAddress = addresses.First();
                PromptDialog.Choice(context, this.AfterAddressChoice, new[] { Resources.AddressDialog_Confirm, Resources.AddressDialog_Edit }, this.currentAddress);
            }
            else
            {
                var reply = context.MakeMessage();
                reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;

                foreach (var address in addresses)
                {
                    reply.AddHeroCard(Resources.AddressDialog_DidYouMean, address, new[] { new KeyValuePair<string, string>(Resources.AddressDialog_UseThisAddress, address) });
                }

                await context.PostAsync(reply);
                context.Wait(this.MessageReceivedAsync);
            }
        }

        private async Task AfterAddressChoice(IDialogContext context, IAwaitable<string> result)
        {
            try
            {
                var choice = await result;

                if (choice == Resources.AddressDialog_Edit)
                {
                    await this.StartAsync(context);
                }
                else
                {
                    context.Done(this.currentAddress);
                }
            }
            catch (TooManyAttemptsException)
            {
         <>       throw;
            }
        }
    }
}
<c#>

اینم کدهای کلاس AddressDialog

namespace TradeBot.BotAssets.Dialogs
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Extensions;
    using Microsoft.Bot.Builder.Dialogs;
    using Microsoft.Bot.Connector;
    using Properties;
    using TradeBot.Services;

    [Serializable]
    public class AddressDialog : IDialog<string>
    {
        private readonly string prompt;
        private readonly ILocationService locationService;

        private string currentAddress;

        public AddressDialog(string prompt, ILocationService locationService)
        {
            this.prompt = prompt;
            this.locationService = locationService;
        }

        public async Task StartAsync(IDialogContext context)
        {
            await context.PostAsync(this.prompt);
            context.Wait(this.MessageReceivedAsync);
        }

        public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
        {
            var message = await result;

            var addresses = await this.locationService.ParseAddressAsync(message.Text);
            if (addresses.Count() == 0)
            {

                await context.PostAsync(Resources.AddressDialog_EnterAddressAgain);
                context.Wait(this.MessageReceivedAsync);
            }
            else if (addresses.Count() == 1)
            {
                this.currentAddress = addresses.First();
                PromptDialog.Choice(context, this.AfterAddressChoice, new[] { Resources.AddressDialog_Confirm, Resources.AddressDialog_Edit }, this.currentAddress);
            }
            else
            {
                var reply = context.MakeMessage();
                reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;

                foreach (var address in addresses)
                {
                    reply.AddHeroCard(Resources.AddressDialog_DidYouMean, address, new[] { new KeyValuePair<string, string>(Resources.AddressDialog_UseThisAddress, address) });
                }

                await context.PostAsync(reply);
                context.Wait(this.MessageReceivedAsync);
            }
        }

        private async Task AfterAddressChoice(IDialogContext context, IAwaitable<string> result)
        {
            try
            {
                var choice = await result;

                if (choice == Resources.AddressDialog_Edit)
                {
                    await this.StartAsync(context);
                }
                else
                {
                    context.Done(this.currentAddress);
                }
            }
            catch (TooManyAttemptsException)
            {
         <>       throw;
            }
        }
    }
}
دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

پاسخ ها به این سوال

پاسخ ها به این سوال

{{ digitTrunc(post.likes) }}

این پست در تاریخ {{ dateString(new Date(post.deleteDate)) }} توسط {{ post.deletedByUser }} حذف شده است.

دلیل حذف: {{ post.deleteReason ?? 'نامشخص' }}

{{ err }}
{{ post.userAchivements.rhodiumAchievements }}
{{ post.userAchivements.platinumAchievements }}
{{ post.userAchivements.goldAchievements }}
{{ post.userAchivements.silverAchievements }}
{{ post.userAchivements.bronzeAchievements }}
{{ timeSince(new Date(post.date)) }} قبل

برای ثبت پاسخ خود در وب سایت وارد حساب کاربری خود شوید
قابلیت ارسال مطلب توسط مدیریت سایت غیر فعال شده است