team2005
asked on
Send email process..
Hi!
Have made a application that send out email to customers.
But attach PDF files to every email i send out..
The system use about 15 sec on every email..
I want this function to be run in the background..
So the user of the system, can run other functions
while the email process is still running.
How can i do that ?
Have made a application that send out email to customers.
But attach PDF files to every email i send out..
The system use about 15 sec on every email..
I want this function to be run in the background..
So the user of the system, can run other functions
while the email process is still running.
How can i do that ?
You can do that by running the email sending in the background :-)
My answer is vague isn't it? That's because your question is vague. Show us some code. Tell us how you are sending the email. Is a winforms app, a windows service, a web app?
ASKER
Hi!
I have a winform made in vb.net.
If example i want to send 1000 emails, the user of this system
cant wait for this job to finish... 1000 email can take hours to complete..
They must be able to run other functions, while the system send emails.
And when the job is complete, it must inform the user..
Maby have a smal top form that shows hows status on the job
I have a winform made in vb.net.
If example i want to send 1000 emails, the user of this system
cant wait for this job to finish... 1000 email can take hours to complete..
They must be able to run other functions, while the system send emails.
And when the job is complete, it must inform the user..
Maby have a smal top form that shows hows status on the job
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
You can use use a task object to let your mail sending methode work in back ground.
it's easy to do if you have 1 start methode to send your mail: and use a Continuswith to fire an event and inform user.
You can see in the attached code an exemple of use.
If you want more detail, give use an exemple of your code (Methode declaration my be enought).
it's easy to do if you have 1 start methode to send your mail: and use a Continuswith to fire an event and inform user.
You can see in the attached code an exemple of use.
If you want more detail, give use an exemple of your code (Methode declaration my be enought).
Private Function Compress(ByVal archive As ICompressArchiveInfo) As String Implements IArchiver.Compress
Dim workItem As ArchiverWorkItem = CreateWorkItem()
workItem.CompressionData = archive
workItem.Task = CreateWorkTask(workItem)
_WorkItemlist.Add(workItem.Id, workItem)
workItem.Task.Start()
Return workItem.Id.ToString
End Function
Private Function CreateWorkTask(item As ArchiverWorkItem) As System.Threading.Tasks.Task
Dim result As System.Threading.Tasks.Task = Nothing
If item.ActionType = WorkItemActionType.Compression Then
result = New System.Threading.Tasks.Task(AddressOf DoCompressWork, CObj(item), Threading.Tasks.TaskCreationOptions.LongRunning + Threading.Tasks.TaskCreationOptions.PreferFairness)
End If
If item.ActionType = WorkItemActionType.Extraction Then
result = New System.Threading.Tasks.Task(AddressOf DoExtractWork, CObj(item), Threading.Tasks.TaskCreationOptions.LongRunning + Threading.Tasks.TaskCreationOptions.PreferFairness)
End If
If result IsNot Nothing Then
Dim CleanupTask As System.Threading.Tasks.Task
CleanupTask = result.ContinueWith(Sub()
FinishWork(item.Id)
End Sub)
End If
Return result
End Function
Private Sub DoCompressWork(archive As ArchiverWorkItem)
Dim targetFile As String = archive.CompressionData.Fullpath
Dim archiver As New Gfk.GfkKynetec.SharedLibraries.Component.Archive.Engine(archive.CancellationToken.Token)
Dim Ar As New Gfk.GfkKynetec.SharedLibraries.Component.Archive.ArchiveConstructorItem
Dim ArchivedItem As Gfk.GfkKynetec.SharedLibraries.Component.Archive.ArchivedItem
AddHandler archiver.Compressing, AddressOf CompressingEventHandler
For Each FilePath As String In archive.CompressionData.FileList
Ar.Files.Add(FilePath)
Next
For Each DirectoryPath As String In archive.CompressionData.DirectoryList
Ar.Directories.Add(New Gfk.GfkKynetec.SharedLibraries.Component.Archive.DirectoryItem(DirectoryPath))
Next
' Add attibut to Archive comments
For Each elt As IAttribut In archive.CompressionData.Attributs
Ar.Attributes.Add(elt.Name, elt.Value)
Next
Ar.ArchivePath = targetFile
' # Callback #
archive.Callback.Start(archive.Id.ToString)
ArchivedItem = archiver.Compress(Ar)
If archiver.IsCancelled Then
'# Callback #
archive.Callback.Cancelled(archive.Id.ToString)
End If
End Sub
Private Sub FinishWork(id As Guid)
' # Callback #
_WorkItemlist.Item(id).Callback.Completed(id.ToString)
_WorkItemlist.Remove(id)
End Sub
ASKER
Hi!
Have this included code now, but it dosent execute the sub -> sendeALLEemailer
Why ?
Have this included code now, but it dosent execute the sub -> sendeALLEemailer
Why ?
Private Sub worker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
MsgBox("ALLE EMAILER ER SENDT", MsgBoxStyle.Information)
Me.Button10.Enabled = True
End Sub
'worker.WorkerReportsProgress = True
'AddHandler worker.DoWork, New DoWorkEventHandler(AddressOf worker_DoWork)
'AddHandler worker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf worker_RunWorkerCompleted)
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
Me.Button10.Enabled = False
worker.WorkerReportsProgress = True
AddHandler worker.DoWork, New DoWorkEventHandler(AddressOf sendeALLEemailer)
AddHandler worker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf worker_RunWorkerCompleted)
End Sub
Private Sub sendeALLEemailer()
Dim i As Integer
Dim s1 As String
Dim s11(100) As String
Dim t1, t2 As Integer
Me.test.Text = Me.headdummyen.Text
t1 = 0
t2 = header.Lines.Length
For i = 0 To (t2 - 1)
s11(i) = header.Lines(i)
t1 = t1 + 1
Next
test.Text += Environment.NewLine + "<table>"
For i = 0 To (t2 - 1)
test.Text += Environment.NewLine + "<tr><td>" & s11(i) & "</td></tr>"
Next
test.Text += Environment.NewLine + "</table>"
test.Text += Environment.NewLine + "</body>"
test.Text += Environment.NewLine + "</html>"
i = 1
For Each itm As ListViewItem In kundermail.Items
' Navn
Me.txtBody.Text = ""
Me.txtBody.Text = Me.body2.Text
Dim s22 As String = impkunderliste(i).navn
'Me.Label11.Text = (i + 1) & "/" & Me.ListBox3.Items.Count
Me.txtBody.Text = Me.txtBody.Text.Replace("*NAVN*", impkunderliste(i).navn & " " & impkunderliste(i).etternavn)
Me.txtBody.Text = Me.txtBody.Text.Replace("*FAKTDATO*", hentfakturanr(impkunderliste(i).kundeid, 2))
Me.txtBody.Text = Me.txtBody.Text.Replace("*MEDLEMSNR*", impkunderliste(i).medlemsnr)
Me.txtBody.Text = Me.txtBody.Text.Replace("*FAKNR*", hentfakturanr(impkunderliste(i).kundeid, 1))
Me.txtBody.Text = Me.txtBody.Text.Replace("*ADR1*", impkunderliste(i).adresse)
Me.txtBody.Text = Me.txtBody.Text.Replace("*ADR2*", impkunderliste(i).postnr & " " & impkunderliste(i).sted)
Me.txtBody.Text = Me.txtBody.Text.Replace("*BESKRIVELSE*", "Støttemedlemsskap SingelSammen! 2011")
Me.txtBody.Text = Me.txtBody.Text.Replace("*ANT*", "1")
Me.txtBody.Text = Me.txtBody.Text.Replace("*PRIS*", "290,-")
Me.txtBody.Text = Me.txtBody.Text.Replace("*RAB*", "0")
Me.txtBody.Text = Me.txtBody.Text.Replace("*SUM*", "290,-")
Me.txtBody.Text = Me.txtBody.Text.Replace("*BILDEFIL*", "http://www.singelnett.no/images/singelsammenfaktura.png")
Dim sjekkstatus As Boolean = sendeemail(impkunderliste(i).epost, i)
If sjekkstatus = True Then
Me.kundermail.Items(0).Selected = True
Me.kundermail.Items.Remove(Me.kundermail.SelectedItems(0))
End If
i = i + 1
Me.Label10.Text = Trim$(Str(i) & "/" & Str(antlinjerreg - 1))
Next
End Sub
The code currently in sendeALLEemailer needs to be moved to DoWork of backgroundworker.
Hi,
Sample of how you can implement your code with task aproche
Sample of how you can implement your code with task aproche
Public Class Form1
Private _cancelToken As System.Threading.CancellationTokenSource
Public Sub Run()
_cancelToken = New System.Threading.CancellationTokenSource
Dim workTask As New System.Threading.Tasks.Task(AddressOf sendeALLEemailer, _cancelToken.Token)
workTask.Start()
End Sub
Private Sub worker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
MsgBox("ALLE EMAILER ER SENDT", MsgBoxStyle.Information)
Me.Button10.Enabled = True
End Sub
Public Sub CancelWork()
_cancelToken.Cancel()
End Sub
'worker.WorkerReportsProgress = True
'AddHandler worker.DoWork, New DoWorkEventHandler(AddressOf worker_DoWork)
'AddHandler worker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf worker_RunWorkerCompleted)
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
Me.Button10.Enabled = False
Run()
End Sub
Private Sub sendeALLEemailer()
Dim i As Integer
Dim s1 As String
Dim s11(100) As String
Dim t1, t2 As Integer
AddHandler worker.DoWork, New DoWorkEventHandler(AddressOf sendeALLEemailer)
AddHandler worker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf worker_RunWorkerCompleted)
Me.test.Text = Me.headdummyen.Text
t1 = 0
t2 = header.Lines.Length
For i = 0 To (t2 - 1)
s11(i) = header.Lines(i)
t1 = t1 + 1
Next
test.Text += Environment.NewLine + "<table>"
For i = 0 To (t2 - 1)
test.Text += Environment.NewLine + "<tr><td>" & s11(i) & "</td></tr>"
Next
test.Text += Environment.NewLine + "</table>"
test.Text += Environment.NewLine + "</body>"
test.Text += Environment.NewLine + "</html>"
i = 1
For Each itm As ListViewItem In kundermail.Items
If _cancelToken.IsCancellationRequested Then
' You can add code to clean your system before cancellation
Exit Sub
End If
' Navn
Me.txtBody.Text = ""
Me.txtBody.Text = Me.body2.Text
Dim s22 As String = impkunderliste(i).navn
'Me.Label11.Text = (i + 1) & "/" & Me.ListBox3.Items.Count
Me.txtBody.Text = Me.txtBody.Text.Replace("*NAVN*", impkunderliste(i).navn & " " & impkunderliste(i).etternavn)
Me.txtBody.Text = Me.txtBody.Text.Replace("*FAKTDATO*", hentfakturanr(impkunderliste(i).kundeid, 2))
Me.txtBody.Text = Me.txtBody.Text.Replace("*MEDLEMSNR*", impkunderliste(i).medlemsnr)
Me.txtBody.Text = Me.txtBody.Text.Replace("*FAKNR*", hentfakturanr(impkunderliste(i).kundeid, 1))
Me.txtBody.Text = Me.txtBody.Text.Replace("*ADR1*", impkunderliste(i).adresse)
Me.txtBody.Text = Me.txtBody.Text.Replace("*ADR2*", impkunderliste(i).postnr & " " & impkunderliste(i).sted)
Me.txtBody.Text = Me.txtBody.Text.Replace("*BESKRIVELSE*", "Støttemedlemsskap SingelSammen! 2011")
Me.txtBody.Text = Me.txtBody.Text.Replace("*ANT*", "1")
Me.txtBody.Text = Me.txtBody.Text.Replace("*PRIS*", "290,-")
Me.txtBody.Text = Me.txtBody.Text.Replace("*RAB*", "0")
Me.txtBody.Text = Me.txtBody.Text.Replace("*SUM*", "290,-")
Me.txtBody.Text = Me.txtBody.Text.Replace("*BILDEFIL*", "http://www.singelnett.no/images/singelsammenfaktura.png")
Dim sjekkstatus As Boolean = sendeemail(impkunderliste(i).epost, i)
If sjekkstatus = True Then
Me.kundermail.Items(0).Selected = True
Me.kundermail.Items.Remove(Me.kundermail.SelectedItems(0))
End If
i = i + 1
Me.Label10.Text = Trim$(Str(i) & "/" & Str(antlinjerreg - 1))
Next
End Sub
End Class
ASKER
thanks