Планировщик заданий потребности в asp.net

Как я объяснил в комментарии, проблема записи данных заключается в том, что вам нужно сохранить StringVar и связанную с ними информацию list вместо того, чтобы перезаписывать предыдущие значения, используя только переменные с одним значением. [1117 ]

Хотя исправление этого было бы возможно без этого, использование вами стольких глобальных переменных делает код трудным для понимания, отладки и изменения - и все это является причиной того, что общепринятым является избегать их как можно больше.

]

Вот список тех, которые использует код в вашем вопросе:

cluster_name, clustername_entry, vm_template, vmdetails_screen, invalid_value_screen, numofvm_screen, vmnumber, [ 1110], N, main_screen

Поскольку это довольно много, я решил также исключить их в приведенном ниже коде, чтобы сделать дизайн более «чистым», кроме того, чтобы показать только, как хранить данные в list с, как предложено. Надеемся, что это даст вам лучшую основу для дальнейшей разработки вашего приложения.

Чтобы избежать global, большинство из них были превращены в атрибуты класса, представляющего все ваше приложение, - это проект, основанный на ответе на пыльник tkinter вопроса от tkinter guru @ Брайан Оукли.

from tkinter import *
import tkinter.messagebox as tkMessageBox
import os
import xlwt


class MyApp(Tk):
    LABEL_BG = "light blue"

    def __init__(self):
        Tk.__init__(self)
        self.geometry("300x250")
        self.title("Welcome")
        Label(text="Select Your Choice", bg=self.LABEL_BG, width="300", height="2",
              font=("Calibri", 13)).pack()
        Label(text="").pack()
        Button(text="Enter", height="2", width="30", command=self.numofvm).pack()
        Label(text="").pack()

    def numofvm(self):
        """ Designing window to provide the number of VMs to be created. """
        self.numofvm_screen = Toplevel(self)
        self.numofvm_screen.title("VM_NUM")
        self.numofvm_screen.geometry("300x250")

        self.vmnumber = StringVar()

        Label(self.numofvm_screen,
              text="Please enter the Number of VMs you wishes to create",
              bg=self.LABEL_BG).pack()
        Label(self.numofvm_screen, text="").pack()

        vmnumber_lable = Label(self.numofvm_screen,
                               text="Number of VMs to be created:")
        vmnumber_lable.pack()

        self.vmnumber_entry = Entry(self.numofvm_screen, textvariable=self.vmnumber)
        self.vmnumber_entry.pack()

        Button(self.numofvm_screen, text="Submit", width=10, height=1,
               command=self.screen_duplicate).pack()

        self.numofvm_screen.focus_set()

    def screen_duplicate(self):
        try:
            self.N = int(self.vmnumber.get())
        except ValueError:
            self.N = 0

        if self.N > 0:
            self.vm_details()

    def vm_details(self):
        """ Create designing windows for VM details.
        """
        # Preallocate and then create VM detail screens and data.
        self.cluster_names = [None for _ in range(self.N)]
        self.clustername_entries = [None for _ in range(self.N)]
        self.vm_templates = [None for _ in range(self.N)]
        self.vmdetails_screen = [None for _ in range(self.N)]

        for i in range(self.N):
            numb = str(i+1)
            self.vmdetails_screen[i] = Toplevel()
            self.vmdetails_screen[i].title("VM Details " + numb)
            self.vmdetails_screen[i].geometry("400x950")

            # Set text variables
            self.cluster_names[i] = StringVar()
            self.vm_templates[i] = StringVar()

            # Set label for user's instruction
            Label(self.vmdetails_screen[i], text="Please enter details below:",
                  bg=self.LABEL_BG).pack()
            Label(self.vmdetails_screen[i], text="").pack()

            Cluster_Name_lable = Label(self.vmdetails_screen[i],
                                       text="Cluster Name "+ numb + ":")
            Cluster_Name_lable.pack()

            # Set textvariables entry
            self.clustername_entries[i] = Entry(self.vmdetails_screen[i],
                                                textvariable=self.cluster_names[i])
            self.clustername_entries[i].pack()

            Button(self.vmdetails_screen[i], text="Submit", width=10, height=1,
                   command=self.validate).pack()

    def validate(self):
        """ Check values of ALL cluster name entries and save them to excel
            file if they're all valid.
        """
        if not all(cluster_name.get() for cluster_name in self.cluster_names):
            self.invalid_value()
        else:
            self.write_to_xls()
            tkMessageBox.showinfo("Info", '"%s" file written' % self.xls_filepath)

            # Get rid of all data entry screens.
            for i in range(self.N):
                self.vmdetails_screen[i].destroy()

            self.numofvm_screen.destroy()

    def invalid_value(self):
        """ Display error message screen.
        """
        self.invalid_value_screen = Toplevel()
        self.invalid_value_screen.title("Invalid Entry")
        self.invalid_value_screen.geometry("400x100")
        Label(self.invalid_value_screen,
              text="Please enter valid values for the fields in ALL\n"
                   "VM Detail windows before clicking Submit button").pack()
        Button(self.invalid_value_screen, text="OK",
               command=lambda: self.invalid_value_screen.destroy()).pack()

    def write_to_xls(self):
        """ Export all user's inputs to an excel sheet. """

        # Create new workbook.
        wb = xlwt.Workbook()

        for i in range(self.N):
            numb = str(i+1)
            # Add sheet using given name.
            ws = wb.add_sheet("VM_" + numb + "_DETAILS")

            # Write text to cell.
            ws.write(0, 0, "Cluster_Name")
            ws.write(1, 0, self.cluster_names[i].get())

        # Save excel file in same directory as script.
        self.xls_filepath = os.path.join(os.path.dirname(__file__), 'my_file.xls')
        wb.save(self.xls_filepath)


if __name__ == '__main__':
    root = MyApp()
    root.mainloop()

6
задан Filip De Vos 3 May 2012 в 14:10
поделиться

9 ответов

How about this: Simulate a Windows Service using ASP.NET to run scheduled jobs.

At one point this technique was used on Stack Overflow, although I don't think it is any more.

To be honest it seems like a nasty, error-prone hack to me, but if you're unable to run anything on the server except your website then something like this is probably your only option.

9
ответ дан 8 December 2019 в 12:22
поделиться

Вам необходимо выполнить работу на сервере, но у вас нет хорошего способа ее запуска из ASP.NET?

Wow по поводу создания веб-страницы, которая начнет вашу работу, и запустите таймер в другом месте (т. е. на другом компьютере), который запрашивает эту страницу. (Просто нажмите на страницу, чтобы вызвать вас на работу)

4
ответ дан 8 December 2019 в 12:22
поделиться

Однако, если вы действительно застряли и у вас нет выбора, кроме как разместить его в своем WebApp,

Вы можете посмотреть на создание экземпляра System.Timers.Timer в вашем файле Global.asax.cs. Подключите событие Elapsed, как обычно, и дайте ему некоторый код, который делает что-то вроде

protected void myTimer_Elapsed(object sender, EventArgs e)
{
    if(System.DateTime.Now Falls in Some Configured Time-Window)
        //Do Stuff
}

. Но, как кто-то указал, это не гарантируется, поскольку IIS может сбрасываться в течение этого периода, в этом случае вы пропустите это.

1
ответ дан 8 December 2019 в 12:22
поделиться

У меня была та же проблема, что и у вас, и в итоге я запрограммировал службу, использующую Quartz.NET: http: //quartznet.sourceforge.

3
ответ дан 8 December 2019 в 12:22
поделиться

Если вы действительно не имеете никакого контроля над сервером (то есть вы не можете использовать задание sql, запланированное задание или установить сервер Windows), тогда вы можете использовать System.Threading .Timer , который вы инициализируете в своем Global.asax (например, при запуске приложения), который вызывает определенный метод в вашем приложении каждые x минут. Затем этот метод будет запрашивать вашу базу данных и видеть, какие уведомления нужно отправлять.

Хотя это действительно нежелательный подход, так как не гарантируется, что таймер всегда будет вызывать, насколько я знаю, поскольку, как говорит Питер, ваш веб-приложение не всегда гарантированно остается активным.

Однако, в зависимости от ваших требований, оно может быть «достаточно хорошим», если у вас нет других вариантов.

1
ответ дан 8 December 2019 в 12:22
поделиться

С ASP.NET вы не гарантируете, что ваше приложение постоянно работает, и, следовательно, веб-приложения в качестве хост-процесса для решения по планированию не осуществимы IMO.

Служба Windows это то, что вам нужно для этого сценария. Вы имеете полный контроль над запуском и остановкой процесса, а также за способами мониторинга приложения.

Можете ли вы разместить такой сервис на другом компьютере? Даже если веб-приложение работает на размещенном сервере, это не значит, что вы должны запускать планировщик на том же сервере.

2
ответ дан 8 December 2019 в 12:22
поделиться

Это действительно нежелательно, но вы можете делать то, что предлагает Раззи. Я видел это много раз. Хотя это некрасиво, но иногда вам просто приходится делать отвратительные хаки.

Однако, используя этот метод, вы должны убедиться, что ваше приложение не выгружено. Так что вам нужно что-то поддерживать. Я бы предложил настроить инструмент веб-мониторинга, который будет постоянно тянуть страницу (aspx), чтобы поддерживать приложение в рабочем состоянии. Эти ребята свободны http://mon.itor.us/

0
ответ дан 8 December 2019 в 12:22
поделиться

Я вам не верю, потому что исходный код Quartz.Net (1.0 и 1.0.1) не компилируется под Visual Studio.Net 2005 и 2008. Единственный способ получить Quartz.Net - это использовать весь пакет Spring.Net, который отлично компилируется под VS.Net 2005 и 2008

Если вы не можете поделиться некоторыми советами, как скомпилировать и использовать quartz.dll в проекте asp.net! (веб-страница Quartz.Net и readme.txt не предоставляет никакой информации о компиляции исходных кодов) Мы приветствуем все советы!

-1
ответ дан 8 December 2019 в 12:22
поделиться

Я вам не верю, потому что исходный код Quartz.Net (1.0 и 1.0.1) {{ 1}} не компилируется под Visual Studio.Net 2005 и 2008.Единственный способ получить Quartz.Net - это использовать весь пакет Spring.Net, который отлично компилирует под VS.Net 2005 и 2008

Если вы не можете поделиться некоторыми советы, как скомпилировать и использовать quartz.dll в проекте asp.net! (веб-страница Quartz.Net и readme.txt не предоставляет никакой информации об исходной компиляции coude) Мы приветствуем все советы !

Сначала у меня тоже были проблемы, но это потому, что необходимый файл AsemblyInfo.cs содержится в родительской папке. Кроме того, вам необходимо добавить три библиотеки DLL, которые входят в комплект.

0
ответ дан 8 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: